【问题标题】:Passing props to useState React将 props 传递给 useState React
【发布时间】:2019-08-11 05:31:00
【问题描述】:

我正在尝试使用来自 redux 的道具作为渲染我的状态完整组件的起点,如下所示:

const MyComp = (props) => {

    const initState = {
        newAttribs: [...props.attribs]
        };

    const [state, setState] = useState(initState)
    console.log(state)

};

const mapStateToProps = (fromRedux) => {...};
const mapDispatchToProps = (dispatch) => {...};

export default connect(mapStateToProps, mapDispatchToProps)(React.memo(MyComp));

但如果我console.log(state) 它显示newAttribs 的空数组,即使initState newAttribs 存在。

有人可以说明如何正确执行此操作吗? 谢谢。

编辑:

我在发布代码 sn-p 时出错,我现在更新了它。 const mapStateToPropsconst mapDispatchToProps 显然必须在组件范围之外,它们是。

【问题讨论】:

    标签: reactjs redux state react-hooks


    【解决方案1】:

    你需要注意三件事

    1. useState 的参数仅在初始加载期间使用一次,并且当 props 更改时状态不会更新
    2. mapStateToPropsmapDispatchToProps 应该在组件范围之外定义
    3. props.attribs 更改时,您需要更新您的组件状态,您可以使用useEffect 执行此操作

    例子

    const MyComp = (props) => {
    
        const initState = {
            newAttribs: [...props.attribs]
        };
    
        const [state, setState] = useState(initState)
    
        useEffect (() => { 
              setState({ ...state, newAttribs: [...props.attribs] }) 
        }, [props.attribs])
        console.log(state)
    
    
    };
    
    const mapStateToProps = (fromRedux) => {...};
    const mapDispatchToProps = (dispatch) => {...};
    export default connect(mapStateToProps, mapDispatchToProps)(React.memo(MyComp));
    

    如果 redux 存储中的数据在初始挂载之前可用,您将在 console.log 中看到它

    【讨论】:

    • 非常感谢。这很有帮助,现在相当明显。我通过以下方式解决了我的问题:useEffect (() => { setState({ ...state, newAttribs: [...props.attribs], }) },[props.attribs])
    • 很高兴能帮上忙。
    • 如果您同意使用useEffect 完成此操作,请将我的代码从评论添加到您的答案中,我会接受。我认为,在这种形式中,答案并不完整,因为它不包括问题的解决方案。
    • 更新了答案。是的,如果您希望根据道具更改更新状态,则需要使用 useEffect
    猜你喜欢
    • 2023-03-08
    • 2021-03-17
    • 2021-09-17
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2017-09-14
    • 2020-04-10
    • 2015-10-30
    相关资源
    最近更新 更多