为什么我的 useState 没有设置默认值
Why my useState doesn't set default value
我的代码(简化版):
const handleEdit = async (event) => {
event.preventDefault();
if (parentLayer === 0) {
const { content, attachment} = event.target.elements;
let contentValue = content.value;
setEditedContent(contentValue);
let attachmentValue = attachment.files[0];
if (contentValue !== content) await updateContent(contentValue);
if (attachmentValue !== undefined && parentLayer === 0) await updateImg(attachmentValue);
} else {
const { content } = event.target.elements;
let contentValue = content.value;
setEditedContent(contentValue);
if (contentValue !== content) await updateContent(contentValue);
}
};
const EditForm = (props) => {
const { content, parentLayer } = props;
const [editedContent, setEditedContent] = useState(content);
<div className='discussion'>
<form className='edit-discussion' onSubmit={handleEdit}>
{parentLayer === 0
?
// Can update img
<input type='file' id='files' name='attachment'/>
<textarea defaultValue={editedContent} required/>
<button type='submit' value='Submit'>submit</button>
:
<textarea defaultValue={editedContent} required/>
<button type='submit' value='Submit'>submit</button>
</form>
</div>
}
问题是,当 parentLayer === 0 时,editedContent 默认为来自 props 的 {content},
如果parentLayer > 0,editedContent为空字符串,
但我已使用控制台检查 {content} 是否具有正确的值。
我的问题,为什么 useState 不能在第二个条件下设置默认值。
为了更好的理解我的程序截图:
一个类似 Reddit 的站点,对于未完成的界面感到抱歉:
编辑时,只能看到父层有默认值:
为什么 React 有这样的行为?
已更新:
我的 React 程序结构:
Mainpage => discussion page => 通过计算得到parentLayer值=> 当parentLayer === 0时渲染最上面的讨论块,否则渲染其余的讨论块。
top块或rest块是否有editform组件。
也就是说,React只会渲染一个页面组件,但会渲染很多editform子组件。
通过完整的视觉设计,
就像Reddit一样(抱歉未完成的设计):
对不起,我的问题不够清楚,但我可能会找到这些行为背后的原因:
{content}是道具,根据
https://learnwithparam.com/blog/how-to-pass-props-to-state-properly-in-react-hooks/
''useState 不会在属性更改时初始化。''
每次父组件的内容发生变化时,editform 子组件将保持相同的状态。
我如何解决我的问题(仅更改部分):
const [editedContent, setEditedContent] = useState('');
useEffect(() => {
setEditedContent(content);
}, [content]);
然后每次创建新层时组件都会重新渲染。
我的代码(简化版):
const handleEdit = async (event) => {
event.preventDefault();
if (parentLayer === 0) {
const { content, attachment} = event.target.elements;
let contentValue = content.value;
setEditedContent(contentValue);
let attachmentValue = attachment.files[0];
if (contentValue !== content) await updateContent(contentValue);
if (attachmentValue !== undefined && parentLayer === 0) await updateImg(attachmentValue);
} else {
const { content } = event.target.elements;
let contentValue = content.value;
setEditedContent(contentValue);
if (contentValue !== content) await updateContent(contentValue);
}
};
const EditForm = (props) => {
const { content, parentLayer } = props;
const [editedContent, setEditedContent] = useState(content);
<div className='discussion'>
<form className='edit-discussion' onSubmit={handleEdit}>
{parentLayer === 0
?
// Can update img
<input type='file' id='files' name='attachment'/>
<textarea defaultValue={editedContent} required/>
<button type='submit' value='Submit'>submit</button>
:
<textarea defaultValue={editedContent} required/>
<button type='submit' value='Submit'>submit</button>
</form>
</div>
}
问题是,当 parentLayer === 0 时,editedContent 默认为来自 props 的 {content},
如果parentLayer > 0,editedContent为空字符串, 但我已使用控制台检查 {content} 是否具有正确的值。
我的问题,为什么 useState 不能在第二个条件下设置默认值。
为了更好的理解我的程序截图:
一个类似 Reddit 的站点,对于未完成的界面感到抱歉:
编辑时,只能看到父层有默认值:
为什么 React 有这样的行为?
已更新:
我的 React 程序结构:
Mainpage => discussion page => 通过计算得到parentLayer值=> 当parentLayer === 0时渲染最上面的讨论块,否则渲染其余的讨论块。 top块或rest块是否有editform组件。
也就是说,React只会渲染一个页面组件,但会渲染很多editform子组件。
通过完整的视觉设计, 就像Reddit一样(抱歉未完成的设计):
对不起,我的问题不够清楚,但我可能会找到这些行为背后的原因:
{content}是道具,根据 https://learnwithparam.com/blog/how-to-pass-props-to-state-properly-in-react-hooks/
''useState 不会在属性更改时初始化。''
每次父组件的内容发生变化时,editform 子组件将保持相同的状态。
我如何解决我的问题(仅更改部分):
const [editedContent, setEditedContent] = useState('');
useEffect(() => {
setEditedContent(content);
}, [content]);
然后每次创建新层时组件都会重新渲染。