【发布时间】:2019-11-29 21:11:11
【问题描述】:
所以我整个上午都在忙,不知道如何使用useState 正确更新我的状态。
我有一个带有name 的受控用户输入。当用户输入文本并提交时,我想获取输入值并将其推送到另一个状态对象 namesList 并映射到子组件中的该数组。
父组件
import React, { Fragment, useState } from 'react';
import TextField from '@material-ui/core/TextField';
import NameInputList from './NameInputList';
const NameInputContainer = () => {
const [name, setName] = useState('');
const [namesList, setNamesList] = useState([]);
const handleChange = event => {
const { value } = event.target;
setName(value);
};
const handleSubmit = event => {
event.preventDefault();
setNamesList(prevState => [...prevState, name]);
setName('');
};
return (
<Fragment>
<form onSubmit={handleSubmit}>
<TextField
id="name"
label="Enter New Name"
variant="outlined"
value={name}
onChange={handleChange}
/>
</form>
{namesList.length > 0 && <NameInputList names={namesList} />}
</Fragment>
);
};
export default NameInputContainer;
子组件
import React from 'react';
import PropTypes from 'prop-types';
const NameInputList = ({ names }) => {
console.log('child component names: ', names);
const generateKey = val => {
return `${val}_${new Date().getTime()}`;
};
return (
<ul>
{names.map((name, index) => ( // <--- Adding the index here seems to resolve the problem. I want to say the error was happening based on issues with having Unique keys.
<li key={generateKey(name + index)}>{name}</li>
))}
</ul>
);
};
NameInputList.propTypes = {
names: PropTypes.arrayOf(PropTypes.string)
};
NameInputList.defaultProps = {
names: []
};
export default NameInputList;
似乎当我第一次提交子组件获得正确的值并按预期呈现时。当我输入一个新名称时,每个handleChange 都会重新呈现。我不确定如何始终如一地:输入文本 > 提交输入 > 更新 namesList > 在子组件中呈现更新的 namesList,而 handleChange 不会破坏功能。
【问题讨论】:
-
我们应该看看里面有什么
NameInputList^^ -
重新渲染将发生,因为
namesList的新副本将作为道具提供,即使其内容没有改变。你能分享NameInputList的代码吗? -
对不起,我想我明白了,当我向地图添加索引时,它按预期工作。我认为它按预期工作,这是我无法理解的。
标签: javascript reactjs react-hooks