reactjs 如何从props初始化react函数组件状态

kpbpu008  于 2023-03-29  发布在  React
关注(0)|答案(6)|浏览(144)

我正在使用React hooks来处理应用状态,我想知道如何使用props来初始化功能组件状态?useState hook文档明确地说,

const [count, setCount] = useState(0);

我想用传递给组件的props的值初始化0值。

import React from 'react';

export default class Sym extends React.Component{

    constructor(props){
        super(props);
        this.state = {
            sym : [0,3,2,8,5,4,1,6],
            active: this.props.activeSym
        }
        this.setActive = this.setActive.bind(this);
    }

    setActive(itemIndex){
        this.setState({
            active: itemIndex
        });
    }

    render(){
        return (
             <div><h1>{ this.state.sym[this.state.active]}</h1></div>
        );
    }
}

工作正常。其中父组件传递activeSym prop,Sym组件使用constructor中的this.props.activeSym初始化状态。是否有任何解决方案在函数组件中实现相同?

6ioyuze2

6ioyuze21#

首先,你可以从props中定义它(如果prop存在):

const [count, setCount] = useState(activeSym);

然后你可以更新这个值,当prop没有立即有一个值时(当组件渲染时):

useEffect(() => {
  if (activeSym) {
    setCount(activeSym);
  }
}, [activeSym])
rqqzpn5f

rqqzpn5f2#

是的,这也可以用函数组件来实现!你只需要添加useEffect来监听prop的变化,用prop值初始化状态

export const newComponent = (props) => {
  const { path, value, info, update } = props;
  const [val, setVal] = useState(value);

  useEffect(() => {
    setVal(value);
  }, [value]);

  return <div>{val}</div>;
};

附加沙盒链接
https://codesandbox.io/s/confident-agnesi-ohkq7?file=/src/MakeComponent.js

idv4meu8

idv4meu83#

是的,你可以首先使用props定义状态:

const [name, setName] = useState(props.obj?.name);

然后你可以如果状态仍然是undefined意味着props没有值,那么:

useEffect(() => {
  if (JSON.stringify(props.obj) !== "{}") {
    setName(props.obj?.name);
  }
}, [props.obj])
xjreopfe

xjreopfe4#

如下所示:

const MyFunctionalComponent = ({myProp}) => {
  const [count, setCount] = useState(myProp)

  return (
     /* ... */
  )
}
2nc8po8w

2nc8po8w5#

export const newComponent = (props) => {
  const { path, value, info, update } = props;
  const [val, setVal] = useState(value);

  useEffect(() => {
    setVal(value);
  }, [value]);

  return <div>{val}</div>;
};

riddhi的代码可以是

export const newComponent = (props) => {
  const { path, value, info, update } = props;

  return <div>{value}</div>;
};

由于每次从父更新时值prop都会更改,因此不需要使用useeffect更新它,特别是因为依赖数组仅包含value
请不要在state中存储props,而是直接使用它们,因为这可能会导致以后在state没有正确更新时很难找到bug

myzjeezk

myzjeezk6#

有两种方法可以更改状态:
1.一个是使用这个.状态和
1.另一个是这个. setState。
我们使用第一个方法来初始化构造函数中的状态,其余时间使用第二个方法。

在构造函数中初始化状态一种方法是在构造函数中初始化状态。正如我们之前讨论的,构造函数是React示例化类时要调用的第一个方法。这是初始化组件状态的理想位置,因为构造函数是在React在UI中呈现组件之前调用的。

class WithConstructor {
   
  constructor() {
   this.state = {
     name: "StackOverflow"
    }
  }
}

Initialize State Without Constructor在React中初始化状态的另一种方法是使用Class属性。一旦类在内存中示例化,类的所有属性都会被创建,这样我们就可以在render函数中读取这些属性。

class WithoutConstructor {
   
  state = {
   name: "StackOverflow"
  }
}

相关问题