【问题标题】:React components rendering incorrectly反应组件渲染不正确
【发布时间】:2017-07-31 10:25:40
【问题描述】:

我有一个 react 项目,一个配方框,其中包括打开配方和添加/删除成分的能力。这里是a fiddle。您可以单击配方名称打开配方。有一个编辑按钮,显示删除按钮并提供更改成分名称的选项。当按下“删除成分”按钮时,无论选择哪种成分,最后一个成分似乎总是被删除,但是当单击“完成”按钮并且可编辑的输入框变回文本时,会显示正确的更改,正确的成分被删除,最后的成分仍然存在。虽然这在功能上有效,但显然对 UI 不太友好,我想知道为什么会这样。任何帮助都会很棒。

jsFiddle

class Input extends React.Component {
  render() {
   const array = this.props.update;
   let booleanButton = null;
   if (this.props.ingr) {
////////////////////////////
// here is the button's JSX
    booleanButton = <button onClick=
    {this.props.handleDeleteIngredient.bind(this, array)}>delete 
    ingredient</button>;
///////////////////////////
   }
 return (<div><form><input type="text" defaultValue={this.props.text} 
   onChange={this.props.onChange.bind(this, array)} /></form>{booleanButton}
  </div>)
  }
}

还有处理程序:

handleDeleteIngredient(data, e ) {
  var key = data[2];
  var ingrs = this.state.ingrs;
  ingrs.splice(key, 1);
  this.setState({ingrs:ingrs});
}

【问题讨论】:

  • 你需要把你所有的数据收集到构造方法里面的状态对象中
  • 所有数据都已经存储在状态
  • 对不起,我没有看到 jsfiddle 链接

标签: javascript reactjs


【解决方案1】:

您的描述很混乱,根据您的小提琴代码,我认为您的问题是由于没有为您的列表项设置好的键引起的。
从它在这一行中的外观来看,您没有 key={ingrs[i]} 道具,尝试将其设置为 id 看看它会起作用,但是将成分名称作为键可能不是一个好主意,尝试给一个真实的身份证。

ingrList.push(&lt;Input key={ingrs[i]} handleDeleteIngredient={this.handleDeleteIngredient.bind(this)} id={id}  update={[this.props.objectIndex, "ingrs", i]} onChange={this.onInputChangeIng.bind(this)} text={ingrs[i]} /&gt;);

【讨论】:

  • 很抱歉描述混乱,您可以点击食谱名称打开它。我知道 key 道具有助于更有效地对 DOM 做出反应,但您的解决方案不起作用:(
  • 好的,这仍然是一个关键问题,我只是没有看太接近代码,因为我不知道它是如何工作的,在你的情况下在非常外部的元素上放置一个唯一键 会成功的,我编辑了我的答案。
  • 太棒了,谢谢!添加 key 道具是如何工作的? id 道具有什么作用?
  • 我不确定 react 组件是否有 id 属性。键帮助 React 识别哪些项目已更改、添加或删除。应为数组内的元素提供键,以使元素具有稳定的身份。只需确保您始终在每个列表元素中都有一个好的唯一键
猜你喜欢
  • 1970-01-01
  • 2021-06-04
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多