gpt4 book ai didi

javascript - React Hooks 仅更新表单提交时的状态

转载 作者:行者123 更新时间:2023-11-28 03:21:37 25 4
gpt4 key购买 nike

所以我整个上午都在研究这个问题,但不知道如何使用 useState 正确更新我的状态。

我有一个带有名称的受控用户输入。当用户输入文本并提交时,我想获取输入值并将其推送到另一个状态对象 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破坏功能.

enter image description here

最佳答案

只需添加一点,由于 namesList prop 是一个数组,因此将为每个父级重新渲染发送一个新副本。因此它的比较将始终为 false,并且 React 将触发子级的重新渲染。

您可以通过这样做来防止重新渲染:

export default React.memo(NameInputList, function(prevProps, nextProps) {
return prevProps.names.join("") === nextProps.names.join("");
});

这将确保 NameInputList 仅在 namesList 的内容实际更改时重新呈现。

关于javascript - React Hooks 仅更新表单提交时的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59111017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com