javascript - 如何在 React 中按另一个过滤数组?
问题描述
我推入的所有内容都arr1
应该从 的映射中删除arr2
,而是返回新的推入值。这是为什么?
const [arr1, setArr1] = React.useState([]);
const arr2= ['banana', 'coconut', 'milk']
React.useEffect(() => {
initList()
}, [])
function add (t) {
setArr1(...arr1, t.currentTarget.value)
console.log('arr1: ' + arr1)
}
function initList () {
setArr1(arr2.filter(arr2 => !(arr1.includes(arr2))).map(arr2 =>
<li>
<input
onChange={add}
type='radio'
name='arr1'
value={arr2}
id={arr2}
/>
<label
for={arr2}
>
{arr2}
</label>
</li>
));
}
return (
<div>
{arr1}
</div>
)
解决方案
- 不要让 JSX 元素保持状态 (arr1)。状态变量只有数据。
- setArr1(...arr1, t.currentTarget.value) --> 此处未设置为数组。更新到 setArr1([...arr1, t.currentTarget.value])
试试这个片段。
const Test = () => {
const [arr1, setArr1] = React.useState([]);
const arr2= ['banana', 'coconut', 'milk']
function add (t) {
setArr1([...arr1, t.currentTarget.value])
console.log('arr1: ' + arr1)
}
return (
<div>
{arr2.filter(arr2 => !(arr1.includes(arr2))).map(arr2 =>
<li>
<input
onChange={add}
type='radio'
name='arr1'
value={arr2}
id={arr2}
/>
<label
for={arr2}
>
{arr2}
</label>
</li>
)}
</div>
)
};
ReactDOM.render(<Test />, document.getElementById('app'));
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
<div id="app"> </div>
推荐阅读
- javascript - 用户输入数字时如何在 JavaScript 中将数字转换为字符串
- html - UILabel sizetofit 隐藏属性文本中的一些单词
- spring-boot - Spring Boot 中的 MeterBinders
- html - 可滚动的 div,在出现的滚动条上跳转内容(!not!html 或 body)(并且仅适用于 css)
- java - 为什么在 JSTL el 表达式中转义引号时出现 JSP 错误“属性未正确终止”?
- python - 使用 NTLK 训练自定义 BIO 标记器
- php - 如何从 MySQL 中的 JSON 数据类型中选择不同的 ID?
- java - 不支持中文Content-Disposition文件名
- vue.js - Vuejs 动态改变 prop
- oracle - 如何在交互式报告中获取 BLOB 下载链接