Reactjs 反应输入默认值不为';t使用道具更改进行更新

Reactjs 反应输入默认值不为';t使用道具更改进行更新,reactjs,redux,react-router,Reactjs,Redux,React Router,我使用React、Redux和React路由器创建了一个应用程序。URL更改时,应使用查询参数personId的值从数组中获取正确的person对象: mapStateToProps = (state, router) => ({ onePerson: state.persons.filter((person, i) => person.id === router.params.personId)[0] }) 我还有一个输入元素,它取决于此人的姓名: <input t

我使用React、Redux和React路由器创建了一个应用程序。URL更改时,应使用查询参数
personId
的值从数组中获取正确的person对象:

mapStateToProps = (state, router) => ({
    onePerson: state.persons.filter((person, i) => person.id === router.params.personId)[0]
})
我还有一个输入元素,它取决于此人的姓名:

<input type="text" defaultValue={this.props.onePerson.name} />


随着URL的更改,
props
相应地更新,输入元素的
defaultValue
不会更改。我如何克服这个问题?请注意,我不想使用“受控输入”。

这是因为
默认值仅在组件第一次渲染时使用。如果以后需要更新该值,则必须使用受控输入

更新:

从:

defaultValue和defaultChecked道具仅在初始阶段使用 提供。如果需要在后续渲染中更新该值,可以 将需要使用受控组件


我想您可以删除并重新添加该组件,给它一个新的
默认值,但您确实不应该这样做,我发现销毁元素、清除所有数据并用新的替换元素很容易:

ReactDOM.unmountComponentAtNode(document.querySelector("#myParentElement"));

        if(document.querySelector("#myParentElement")){
            ReactDOM.render(
                <MyComponent name={name}  />,
                document.querySelector("#myParentElement")
            );
        };

有没有办法强制重新渲染以响应路由器的更改?是的,您可以强制重新渲染,但这对您没有帮助。默认值仅在第一次渲染期间使用。为什么不想使用受控输入?因为我的存储中有一个person数组,用户可以从服务器获得该数组,用户可以在表单中更改每个数组。。。然后按save以更改服务器中的人员,但在受控输入中,对于更改输入,我必须在输入更改时按操作更改stroe中的人员,因此如果用户更改输入,则不按save。。存储区显示实际未保存的人员更改。在这种情况下,您可以存储服务器上的名称和编辑的名称。因此,如果输入未被触及,则显示实际名称。然后,一旦它被更改,您将该更改添加到editedName中,并在输入中显示该更改。现在你可以很容易地提交这个新名字,或者恢复到原来的名字。看起来很不错。tnx my Friends您应该在设置默认值的组件中执行此筛选逻辑,而不是
MapStateTops
MapStateTops
位于包含
defaultValue
输入的组件中。如果我不打算设置道具
mapstatetops
我还能在哪里访问应用程序状态来设置道具?它实际上不在组件中,而是在容器中。您希望您的组件读取它并进行筛选。如果您只想在加载时执行一次,那么可以利用组件生命周期功能(如componentDidMount)。
ReactDOM.unmountComponentAtNode(ReactDOM.findDOMNode(this).parentNode);