Javascript 为什么不是';组件是否提供了正确的信息?反应

Javascript 为什么不是';组件是否提供了正确的信息?反应,javascript,reactjs,Javascript,Reactjs,我正在渲染一个值数组,我有两个按钮,一个是添加,另一个是删除。一切都按它应该的方式工作,但当我单击“删除”时,正确索引中的元素将从数组中删除,但当它再次渲染时,它将删除最后一个条目,而不是该特定索引中的条目 例如:(左侧为网页,右侧为控制台) 当前数组是[“hello”,“world”,“everyone”],假设我想删除“world”,我单击它旁边的删除按钮,数组会正确更新(我做了一个console.log),它会变成[“hello”,“everyone”],它会重新渲染,但会显示它,就好像

我正在渲染一个值数组,我有两个按钮,一个是添加,另一个是删除。一切都按它应该的方式工作,但当我单击“删除”时,正确索引中的元素将从数组中删除,但当它再次渲染时,它将删除最后一个条目,而不是该特定索引中的条目

例如:(左侧为网页,右侧为控制台)

当前数组是
[“hello”,“world”,“everyone”]
,假设我想删除
“world”
,我单击它旁边的
删除
按钮,数组会正确更新(我做了一个console.log),它会变成
[“hello”,“everyone”]
,它会重新渲染,但会显示它,就好像数组是
[“hello”,“世界”]
并错误地呈现:

我不确定我对代码做了什么错误的处理,因为数组得到了正确的更新,其他一切似乎都正常

    childChange: function(name, valid, value) {

        this.state.values = this.props.values;
        var pattern = /[0-9]+/;                                             // Using regex to find last digits from 0-9
        var match = name.match(pattern);                                    // Update state
        var i = parseInt(match);                                            // Parse char into int
        // console.log(match);

        this.state.values[i] = value;

        this.setState(this.state);

        this.props.callback(                                                // Call parent callback
            this.props.name,
            this.props.node.valid(this.state.values),
            this.state.values
        );
    },

    addEmptyItem: function() {

        this.state.values = this.props.values;
        this.state.values.push("");
        this.setState(this.state);

    },

    removeItem: function(ev) {

        console.log(ev.currentTarget.dataset.index);
        var i = parseInt(ev.currentTarget.dataset.index);
        this.state.values = this.props.values;
        this.state.values.splice(i,1);
        console.log(this.state.values);
        this.setState(this.state.values);

    },

        render: function() {
            var that = this;

            console.log("===RENDER===");

            return (
                <div id = "form">
                {this.props.values.map(function(v, i) {
                    return (

                        <div>
                            {(that.props.node.get().constructor.name === "Parent") ?
                            <ParentComponent
                                name={that.props.name + i}
                                key={i}
                                timer={that.props.timer}
                                callback={that.childChange}
                                values={v}
                                newParent={that.props.node.get()}
                            />
                            :
                            <div>
                                <NodeComponent
                                    name={that.props.name + i}
                                    key={i}
                                    timer={that.props.timer}
                                    callback={that.childChange}
                                    value={v}
                                    newNode={that.props.node.get()}
                                />

                            </div>

                            }
                            <button data-index={i} onClick={that.removeItem}>Remove
                            </button>
                        </div>

                    )
                })}
                <button onClick={() => that.addEmptyItem()}>Add
                </button>

                </div>
           )

        }
childChange:函数(名称、有效值、值){
this.state.values=this.props.values;
var pattern=/[0-9]+/;//使用正则表达式查找0-9中的最后一位数字
var match=name.match(模式);//更新状态
var i=parseInt(匹配);//将字符解析为int
//控制台日志(匹配);
this.state.values[i]=值;
this.setState(this.state);
this.props.callback(//调用父回调
这个.props.name,
this.props.node.valid(this.state.values),
这是我的价值观
);
},
addEmptyItem:function(){
this.state.values=this.props.values;
this.state.values.push(“”);
this.setState(this.state);
},
removeItem:功能(ev){
log(ev.currentTarget.dataset.index);
var i=parseInt(ev.currentTarget.dataset.index);
this.state.values=this.props.values;
该状态值拼接(i,1);
console.log(this.state.values);
this.setState(this.state.values);
},
render:function(){
var=这个;
console.log(“==RENDER==”);
返回(
{this.props.values.map(函数(v,i){
返回(
{(that.props.node.get().constructor.name==“Parent”)?
:
}
去除
)
})}
that.addEmptyItem()}>Add
)
}

将函数更改为如下所示:

removeItem: function(ev) {

        console.log(ev.currentTarget.dataset.index);
        var i = parseInt(ev.currentTarget.dataset.index);
        let values = [...this.props.values];
        values.splice(i,1);
        console.log(this.state.values);
        this.setState(values);

    }
为什么?当您使用react state时,从不直接更改它。您可以在中查看它。
您在这里所做的是更改状态,然后调用“setState”,这不起作用。您应该创建新变量,操纵新变量,然后使用新变量调用setState将函数更改为如下所示:

removeItem: function(ev) {

        console.log(ev.currentTarget.dataset.index);
        var i = parseInt(ev.currentTarget.dataset.index);
        let values = [...this.props.values];
        values.splice(i,1);
        console.log(this.state.values);
        this.setState(values);

    }
为什么?当您使用react state时,从不直接更改它。您可以在中查看它。
您在这里所做的是,您更改了状态,然后调用了“setState”,这不起作用。您应该创建新变量,对新变量进行操作,然后使用新变量调用setState

即使在创建新变量并对其进行操作并调用setState之后,我也无法使其正确渲染。它没有更新removeItem中新的
数组,但没有正确渲染我可以看到您在渲染函数中渲染props.values,而不是state.values,如果您刚刚更新,这可能是您的问题吗?我不相信?我一直在使用
props.values
渲染它,即使使用
添加,它也没有任何问题EmptyItem
。我不确定还有什么问题。我建议您重新组织代码,同时更改状态和道具太麻烦了。请尝试以下方式之一重写组件:1.呈现state.values而不是prop.values。2.继续呈现state.props,但不要保留state.props但删除会发生在父组件中。即使在创建新变量并对其进行操作并调用setState之后,我也无法使其正确渲染。它在removeItem中更新了新的
数组,但没有正确渲染。我可以看到您在渲染函数中而不是在状态中渲染props.values.values,如果您刚刚更新,可能是您的问题吗?我不相信。我一直在使用
道具渲染它。values
并且它没有任何问题,即使使用
addEmptyItem
。我不确定还有什么问题。我建议您重新组织代码,更改状态和属性太麻烦了同时使用props。尝试用以下方法之一重写组件:1.渲染state.values而不是prop.values。2.继续渲染state.props,但不保留state,但删除将发生在父组件中。