Используйте родительский компонент для передачи начального значения дочернему, не полагаясь на состояние ReactJS

#javascript #reactjs

#javascript #reactjs

Вопрос:

У меня есть родительский компонент A, который вычисляет некоторое начальное значение для своего дочернего компонента B. На самом деле я вычисляю начальное значение в componentDidMount() компонента A и передаю его в B через props:

 <ComponentB initialValue={this.state.value} handleChange={this.handleChange}/>
  

И в компоненте B я делаю

 this.state = {value: this.props.initialValue}
  

После этого компонент B должен самостоятельно управлять своим состоянием. Но каждый раз, когда это изменение значения, я хочу, чтобы оно обновляло состояние A, но с меньшим количеством информации.

В компоненте B:

 const onChange = (event) => { 
      this.setState({value: event.target.value   "only in B"});
      this.props.handleChange(this.state.value);
}
  

В ComponentA:

 const handleChange = (value) => { 
      this.setState({value: value});
}
  

Проблема в том, что A всегда имеет последнее слово, а значение в B не сохраняет суффикс «только в b». A сбрасывает значение состояния B на его внутреннее значение состояния с помощью реквизита initialValue при повторном отображении.

Итак, по сути, то, что я хочу сделать, это наследовать начальное значение от A при первом рендеринге, а затем обновлять состояние, когда в B происходит изменение, не стирая состояние B.

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

1. Это не совсем ответ на ваш вопрос, но я хотел сказать, что то, что вы пытаетесь сделать, противоречит естественному способу передачи данных в React, поэтому вы боретесь. Вообще говоря, родительский компонент всегда должен передавать самую последнюю и актуальную информацию своим дочерним элементам, а также обрабатывать управление этими данными. Если это данные, которые родитель никоим образом не использует и которые чрезвычайно локализованы для дочернего элемента, то данные никогда не должны передаваться, они должны исходить из дочернего элемента как состояния.

2. Что касается самого вашего вопроса, любое изменение в родительском элементе приведет к повторному переходу дочернего элемента, это перезапишет текущее состояние дочернего элемента реквизитами, которые теперь были изменены. Единственный способ обойти эту проблему — изменить свой подход одним из способов, которые я перечислил выше, вероятно, переместив источник данных на дочерний элемент.

3. @Reifocs: В вашем коде нет ничего явно неправильного. Может быть полезно опубликовать полный пример как родительского, так и дочернего компонентов, чтобы увидеть, происходит ли что-то еще. Возможно, вы по какой-то причине повторно монтируете дочерний элемент, что приведет к сбросу состояния.

Ответ №1:

Эй, даже если вы можете сделать это лучше, если я правильно понял, я думаю, вы можете достичь того, чего хотите, просто используя:

this.props.value

на компоненте B:

<input defaultValue={this.props.value} onChange={this.onChange}/>

а затем, когда вы обрабатываете обновление, просто передайте event.target.value его родительскому элементу (компоненту).

Я не уверен на 100%, что это то, о чем вы спрашиваете, но вот пример:

https://codepen.io/pegla/pen/qBNxqBd?editors=1111

Ответ №2:

Любое изменение в родительском компоненте вызовет повторную визуализацию дочернего компонента. Я считаю, что лучший подход к вашей ситуации — после наследования начального значения от A установить некоторую локальную переменную состояния для компонента B, чтобы управлять этим состоянием специально, чтобы оно было отдельно от A.