![](/img/trans.png)
[英]how does react props merge state passed from parent component and redux store
[英]Redux store state from React component's props does not reflect redux store's state value
我有一个反应组件,它有 3 个输入字段和一个按钮。
该组件连接到一个 redux 存储。
有一个动作创建者可以通过 Web API 调用来获取用户的位置信息并更改 redux 存储中的状态。
表单中按钮的onClick
事件有一个handleOnClick
处理程序,它调用 action 来更新 store 的状态,然后它调用setFormData
来更新输入字段中的值以更改输入字段的值。
import React, {useState} from 'react';
import {connect} from 'react-redux';
import {setLocation} from "../actions/location.js";
const LocationForm = ({location, setLocation}) => {
const [formData, setFormData] = useState({
city:"",
state:"",
country:""
})
const handleOnChange = (e) => {
setFormData({...formData, [e.target.name]:e.target.value})
}
const handleOnClick = () => {
setLocation();
console.log(location) //!! output: {city:"", state:"", country:""}
const {city, state, location} = location;
setFormData({...formData, city, state, location})
}
const {city, state, country} = formData;
return (
<form>
<button onClick={handleOnClick}/>
<label>
City:
<input name="city" value={city} onChange={handleOnChange}/>
</label>
<label>
State:
<input name="state" value={state} onChange={handleOnChange}/>
</label>
<label>
Country:
<input name="city" value={country} onChange={handleOnChange}/>
</label>
</form>
)
}
const mapStateToProps = (state) => {
location: state.location
}
export default connect(mapStateToProps, {setLocation})(LocationForm);
问题:从handleOnClick
的console.log()
handleOnClick
,从 redux 存储传递的location
对象的状态仍然具有空字符串作为键值(城市、州、国家)。 但是 redux chrome devtool 中的状态确实表明 location 的状态已更改并且它们具有正确的值。 为什么组件道具中的位置对象没有反映这一点? 我是否需要使用useEffect
钩子来更新组件道具中的location
对象?
提前致谢。
如果你想监控location
属性的变化,你必须使用一个钩子,这里是一个例子:
import React, {useState, useEffect} from 'react';
import {connect} from 'react-redux';
import {setLocation} from "../actions/location.js";
const LocationForm = ({location}) => {
..
useEffect(() => {
console.log(location)
const {city, state, location} = location;
setFormData({...formData, city, state, location})
}, [location]);
const handleOnClick = () => {
setLocation();
}
..
}
每次作为第二个参数传递的数组元素发生变化时, useEffect
调用作为第一个参数传递给useEffect
的函数。
在这里,每次location
更改时, setFormData
使用location
的新值调用setFormData
。
您将 mapDispatchToProps 匿名对象传递给connect
,但不在组件中使用它。 相反,您将setLocation()
作为普通函数调用而无需调度。 您需要调用道具,而不是像这样调用导入的函数:
const LocationForm = ({location, setLocation}) => {
...
setLocation()
...
export default connect(mapStateToProps, {setLocation})(LocationForm);
import {useSelector, useDispatch} from 'react-redux' ... const LocationForm = () => { const location = useSelector((state) => state.location) const dispatch = useDispatch() ... const handleOnClick => { dispatch(setLocation) // if setLocation = (dispatch) => ... // dispatch(setLocation()) // if setLocation = () => (dispatch) => ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.