Сброс состояния после выполнения чего-либо без повторного рендеринга

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я хочу выделить новую задачу после ее создания. Однако при добавлении новой задачи вся таблица будет повторно отображаться, поэтому, хотя у меня так много случаев что-то сделать перед рендерингом, она будет сброшена. Поэтому я объявляю newTaskID: null состояние, предназначенное для хранения идентификатора, и выделяю его после рендеринга, что хорошо. Однако мне также нужно newTaskID: null вернуть значение null, что снова вызовет повторный рендеринг, который сбросит мою таблицу и мою выделенную задачу. Я знаю, что что-то пропустил, но пока не могу этого понять. Пожалуйста, помогите.

 constructor(props) {
    this.state = {
        newTaskID: null
    }
}

createTask = (value) => {
    /.....
    this.setState({ newTaskID: value.id })
}

componentDidMount() {
    gantt.attachEvent('onGanttRender', function () {
        if (this.state.newTaskID) {
            //Highlight task and set state back to null
            highlightTask(this.state.newTaskID)
            //Set state back to null so it won't highlight anything
            this.setState({ newTaskID: null })
        }
    })
}
  

Ответ №1:

Добавьте дополнительный флаг в состояние, чтобы проверить, есть ли выделенная задача. Это было бы что-то вроде этого:

 this.state = {
  newTaskID: null,
  taskIsHighlighted: false,
}
  

И вы должны установить taskIsHighlighted значение true, когда задача была выделена, и установить значение false при следующем рендеринге. Ваш componentDidMount будет:

 componentDidMount() {
    gantt.attachEvent('onGanttRender', function () {
        if (this.state.newTaskID) {
            //Highlight task and set state back to null
            highlightTask(this.state.newTaskID)
            //Set state back to null so it won't highlight anything
            this.setState({ taskIsHighlighted: true })
        }

        if (this.state.taskIsHighlighted) {
          this.setState({ newTaskID: null, taskIsHighlighted: false })
        }
    })
}