Javascript 儿童道具活动不包括';t持有母公司';中国的现状
我有一个状态变量,它保存动态创建的组件,但是,当我从作为道具传递给子级的函数访问状态时,我会从创建时的后面获取状态。当我记录useffect时不是这样 例如:我添加了3个子元素,在函数logMyChildren中,我获得了创建最后一个子元素之前的状态 第一个孩子Javascript 儿童道具活动不包括';t持有母公司';中国的现状,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我有一个状态变量,它保存动态创建的组件,但是,当我从作为道具传递给子级的函数访问状态时,我会从创建时的后面获取状态。当我记录useffect时不是这样 例如:我添加了3个子元素,在函数logMyChildren中,我获得了创建最后一个子元素之前的状态 第一个孩子mychildren是[] 第二个孩子myChildren是[{id为0的孩子] 第三个孩子myChildren是[{id为0的孩子,{id为1的孩子] 每次调用该函数时,它都会给每个子函数提供相同的状态 是否有一种方法可以获得当前状态(
mychildren
是[]
第二个孩子myChildren
是[{id为0的孩子]
第三个孩子myChildren
是[{id为0的孩子,{id为1的孩子]
每次调用该函数时,它都会给每个子函数提供相同的状态
是否有一种方法可以获得当前状态(而不是来自过去的状态),而不考虑子级
const Parent = () => {
const [myChildren, setMyChildren] = useState([])
const addChild = () => {
let id = myChildren.length + 1
setMyChildren([
...myChildren,
<Child key={id} id={id} logMyChildren={logMyChildren} />,
])
}
const logMyChildren = (id) => {
console.log(id, myChildren)
}
useEffect(() => {
console.log(myChildren)
}, [myChildren])
return (
<>
<button onClick={addChild}>Add a child</button>
{myChildren && myChildren.map((child) => child)}
</>
)
}
const Child = ({ id, logMyChildren }) => {
return (
<>
<p>A child with id {id}!</p>
<button onClick={() => logMyChildren(id)}>X</button>
</>
)
}
const Parent=()=>{
const[myChildren,setMyChildren]=useState([])
常量addChild=()=>{
让id=myChildren.length+1
我的孩子们([
…我的孩子们,
,
])
}
const logMyChildren=(id)=>{
console.log(id,myChildren)
}
useffect(()=>{
console.log(myChildren)
},[myChildren])
返回(
添加一个孩子
{myChildren&&myChildren.map((child)=>child)}
)
}
const Child=({id,logMyChildren})=>{
返回(
id为{id}的孩子
logMyChildren(id)}>X
)
}
每次运行useffect()
时,它都具有更新的状态。
谢谢。您遇到的问题是,您正在创建包含状态变量的
logMyChildren
(在您的示例中是mychildren
)。
您可以使用useRef
大概是这样的:
const stateRef = useRef();
stateRef.current = myChildren;
然后在logMyChildren
中使用ref-stateRef
:
console.log(id,stateRef.current);
你说得对,谢谢!但是,我需要状态来删除项,我想我会尝试使用Redux。您可以将deleteFunction传递给子组件。还有一个问题是,如果您不这样做,而是将一些对象映射到组件,那么您将在状态中创建子组件的数组-您没有这样的问题。为什么因为每次您都会将函数的“新鲜”实例传递给子组件。(在您的情况下,函数的前一个实例将阻塞在您的状态中,并且永远不会更新)。所以在这里您并不真正需要Redux,只是不使用状态中的组件,或者使用答案中提供的ref——但实际上在这种情况下,我不建议这样做