React组件呈现不正确

问题描述:

我有一个反应项目,一个配方框,其中包括打开配方和添加/删除配料的功能。这里是a fiddle。您可以单击食谱名称打开食谱。有一个编辑按钮显示删除按钮,并提供选项来更改配料的名称。当按下'删除配料'按钮时,不管选择了哪种配料,最后一个配料总是被删除,但是当'完成'按钮被点击并且可编辑的输入框变回到文本时,显示正确的改变,适当的成分被删除,最后的成分仍然存在。虽然这在功能上起作用,但它显然不是非常友好,我想知道为什么会发生这种情况。任何帮助都会很棒。React组件呈现不正确

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}); 
} 
+0

你需要将所有数据收集到的构造方法 –

+0

里面的状态对象中的所有数据都存储在状态已经 – asparism

+0

很抱歉,我没有看到的jsfiddle链接 –

你的描述是安静的混乱,并根据您的提琴代码,我认为你的问题是没有设置你的列表一个很好的钥匙引起的项目。
从它看起来在这一行,你没有一个关键= {ingrs [i]}道具,尝试将它设置为ID看到它会起作用,但将ingrediant名称作为关键字可能不是一个好主意,请尝试给一个实际的ID。

ingrList.push(<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]} />);

+0

我很抱歉描述混乱,您可以点击食谱名称将其打开。我知道'key'道具可以帮助更有效地对DOM进行渲染,但是你的解决方案不起作用:( – asparism

+0

好吧,它仍然是一个关键问题,我只是没有看起来太接近代码, t知道它是如何工作的,在你的情况下在一个非常外部的元素上加上一个唯一的键将使它工作,我编辑了我的答案 –

+0

真棒,谢谢! 'prop do? – asparism