reactjs - 更新项目数组时使用 React useState 更新 UI 时出现问题
问题描述
很难用 React 和 useState 更新我的 UI。任何帮助将不胜感激。基本上我想要做的只是删除用户添加的项目。
interface RedirectUrls {
url: string;
}
const [redirectUrls, setRedirectUrls] = useState<RedirectUrls[]>([
{
url: ''
}
])
function deleteRedirectUrl(url): void {
let tmpUrls = redirectUrls
tmpUrls = tmpUrls.filter(item => item.url !== url)
setRedirectUrls(tmpUrls)
}
function handleChange (index, event): void {
const tmpUrls = [...redirectUrls]
tmpUrls[index].url = event.target.value
}
{redirectUrls.map((item, index) => {
return (
<div key={index}>
<input type='text' onChange={(event):void => {handleChange(index,event)}}/>
<div onClick={():void => {deleteRedirectUrl(item.url)}}>remove</div>
</div>
)
})}
解决方案
几点:
- 组件应返回单个元素。在您的情况下, map 返回一个元素数组,我必须使用一个空元素(或<React.Fragment>)包装该集合
- 不要忘记将
value
属性设置为input
element 以使更改反映在元素中。 - 作为最佳实践,在处理状态变量时使用
const
而不是,将它们视为不可变的,以避免丢失更改,尤其是当有许多状态变量导致多次渲染时let
- 我们应该将类型声明为文件是打字稿,您错过了为函数的参数指定类型
- 进行修改后应调用 setter
import React, { useState } from 'react';
interface RedirectUrls {
url: string;
}
const App = () => {
const [redirectUrls, setRedirectUrls] = useState<RedirectUrls[]>([
{
url: 'firstUrl'
},
{
url: 'secondUrl'
}
])
function deleteRedirectUrl(url: string): void {
const tmpUrls = redirectUrls.filter(item => item.url !== url)
setRedirectUrls(tmpUrls)
}
function handleChange(index: number, event: React.ChangeEvent<HTMLInputElement>): void {
const tmpUrls = [...redirectUrls]
tmpUrls[index].url = event.target.value
setRedirectUrls(tmpUrls);
}
return <>{redirectUrls.map((item, index) => <div key={index}>
<input type='text' value={item.url} onChange={(event): void => { handleChange(index, event) }} />
<div onClick={(): void => { deleteRedirectUrl(item.url) }}>remove</div>
</div>)}</>;
}
export default App;
推荐阅读
- javascript - ReactNative 中的异步/等待问题
- excel - 如何编写包含来自源单元格的单元格格式的 VBA Vlookup?
- python - libreOffice - 无法让 python 宏出现在“组织宏”下
- typescript - 如何修复类型“未知”不可分配给 React 打字稿中的类型“国家 []”
- c++ - 如何在 sfml 中“设置变换的原点”
- android - 某些记录会在某个时间点后使用 Sugar ORM 从 Android SQLite 数据库中自动删除
- javascript - 如何固定一个元素在弹性框中的位置?
- php - 从数据库中检索图像并显示它 Laravel
- javascript - axios cancelToken,让取消的请求静默失败
- java - 如何在 AndroidStudio 中自动停止根据 NumberPicker 更改值?