const { contacts, getContacts, } = useContext(
ContactContext
);
useEffect(() => {
getContacts();
//eslint-disable-next-line
});
//prettier-ignore
return (
<Fragment>
{contacts.length === 0 ? (
<h4 style={{ textAlign: 'center' }}>Please add a contact</h4>
): null}
{contacts.map(contact => (
<ContactItem contact={contact} />
))}
</Fragment>
);
};
contacts
最初是一个空数组,并且在getContacts
向服务器发出请求之后,它更新了contacts
状态
但是即使getContacts()
返回包含几个联系人的数组后,总会显示“请添加联系人”字样。似乎并没有重新渲染该部分组件,因为最初运行该组件时,contacts
是一个空数组
答案 0 :(得分:2)
谈到“为什么/不更新我的组件”,React遵循三个简单规则。只会在以下情况下“重新渲染”您的组件:
对于后两个,使用适当的setter方法正确更改它们是至关重要的。例如,如果您通过挂钩使用状态(相对于基于类的状态),即
const [foo, setFoo] = useState('');
您已经使用setFoo
:
setFoo(newValue);
如果仅更改Javascript变量:
foo = newValue;
React无法得知更改,因此您的组件不会重新呈现。
虽然您没有显示所有代码,但很可能您是在直接更改上下文,而不是使用适当的setter函数(作为状态变量的一部分)。
P.S。如果您需要澄清使用状态控制上下文的模式,请参见https://reactjs.org/docs/context.html#updating-context-from-a-nested-component。
答案 1 :(得分:1)
请使用名为useState
的钩子
import { useState } from "react";
const { contacts, getContacts, } = useContext(
ContactContext
);
const [state, setState ] = useState({
contacts:[]
})
useEffect(() => {
setState({
contact:getContacts()
})
//eslint-disable-next-line
});
//prettier-ignore
return (
<Fragment>
{state.contacts.length === 0 ? (
<h4 style={{ textAlign: 'center' }}>Please add a contact</h4>
): null}
{state.contacts.map(contact => (
<ContactItem contact={contact} />
))}
</Fragment>
);
};
答案 2 :(得分:0)
唯一起作用的是这个,但是我不知道为什么以前不起作用以及为什么现在可以起作用:
if(contacts.length === 0 ){
return <h4>Please add a contact</h4>
}
我将这一行代码放在另一个return语句之上