Изменение реквизита компонента на основе функции onBlur в React

#javascript #reactjs #react-redux

#javascript #reactjs #react-redux

Вопрос:

У меня есть компонент, который я могу изменить способ его отображения на основе реквизита (добавлено состояние сбоя, и в зависимости от того, происходит сбой или нет, он становится красным или остается оригинальным цветом), логика того, является ли сбой true или false находится в родительском компоненте.

Я хочу изменить состояние сбоя, но только onBlur (без изменения дочернего компонента). Есть ли способ передать onBlur функцию, которая применяет изменения к дочернему реквизиту?

Я пробовал несколько разных вещей, таких как:

Дочерний компонент:

 <input 
  failed={failed}
  onBlur={onBlur}
/>
  

Родительский компонент:

 handleBlur(value) {
  this.props.failed = value;
}
  

В функции визуализации:

 onBlur={() => this.handleBlur(newValue)}
  

Но у меня это не сработало.

Комментарии:

1. props являются неизменяемыми

2. это имеет смысл, но как бы вы отнеслись к внесению такого изменения?

3. Вместо этого вы используете компонент state .

4. в родительском компоненте вы должны сделать это вместо этого this.setState({failed: value}) , а затем передать failed от state дочернему компоненту

Ответ №1:

Реквизит — это данные, которые передаются от родительского элемента к его дочерним элементам и становятся доступными через this.props дочерний компонент.

Вы сохраняете любой реквизит, который вы передаете дочернему компоненту, либо в состоянии родительского компонента, либо в состоянии redux / flux (если у вас есть глобальное управление состоянием).

При failed изменении должно быть инициировано изменение состояния родительского компонента, что, в свою очередь, вызовет повторный рендеринг внутри дочернего компонента.

Например:

Далее мы передаем его failed как реквизит, а onFailureUpdate функционируем как триггер обратного вызова дочернего компонента из родительского.

 class Parent extends React.Component {
 constructor(props) {
  super(props);
  this.state = {
   failed: false
  }
 }

 onFailureUpdate = (value) => {
   this.setState({
    failed: value
   });
 }

 render() {
  return (<ChildComponent failed={this.state.failed} onFailureUpdate={this.onFailureUpdate} />)
 }
}
  

В дочернем компоненте, в blur, мы используем функцию, которую мы передали в качестве реквизита, для изменения состояния в родительском компоненте, который, в свою очередь, повторно отобразит дочерний компонент.

 class ChildComponent extends React.Component {
  onBlur = (e) => {
    this.props.onFailureUpdate(e.target.value);
  }

  render() {
    return (
      <input 
        value={this.props.failed}
        onBlur={(e) => this.onBlur(e)}
      />
    )
  }
}
  

Другой способ:

Или, если нет необходимости в реквизитах или отношениях родитель-потомок, вы можете устранить необходимость в родительском контейнере и перейти к обслуживанию состояния в дочернем.

 class RewrittenChildComponentWithState extends React.Component {
  constructor() {
   this.state = {
    failed: false
   };
  }

  onBlur = (e) => {
    this.setState({
     failed: e.target.value
    });
  }

  render() {
    return (
      <input 
        value={this.state.failed}
        onBlur={(e) => this.onBlur(e)}
      />
    )
  }
}
  

Надеюсь, это решит вашу путаницу.

Комментарии:

1. В итоге я просто пошел по пути, который пытался обойти, и просто создал действие для переключения количества и передал его через состояние. По-видимому, React Hooks также предлагает решение для этого, но для меня это было невозможно. Спасибо всем за помощь!