reactjs - 在反应中传递和返回useState
问题描述
是的,所以我正在努力学习反应,我正在做一个简单的项目来更好地理解它。
基本上我要做的是使用一个文件中的 useState 并让它通过另一个文件上的 onClick 函数进行更改,如下所示:
列表.js
export const List= [
{id:1, obj:'item1'},
{id:2, obj:'item2'},
{id:3, obj:'item3'},
{id:4, obj:'item4'},] ;
index.js
import React,{useState} from 'react'
import {List} from './list'
import ItemList from './ItemList'
function Items(){
const [items,setItems] = React.useState(List);
return (
<>
<h1>{items.length} Items in total</h1>
{items.map((itemArr)=>{
return (
<ItemList {...itemArr}/>
)
})}
</>
)
}
ReactDom.render(<Items />,document.getElementById('root')
)
项目列表.js
import React from 'react'
function ItemList(props) {
const {id,obj} = props;
const removeItem = (id) =>{
//Code Here
}
return (
<div>
<h3>{id}</h3>
<h4>{obj}</h4>
<button onClick={()=> removeItem(id)}>Remove</button>
</div>
)
}
export default ItemList
我想要做的是,当我单击按钮时,该removeItem
功能将删除带有id
和使用的任何项目.filter
。但我面临的问题是我似乎无法找到如何调用和返回一些东西setItems
以便我可以更改值。而且我找不到传递setItem
给itemList.js
.
解决方案
您可以setItems
作为道具传递给ItemList
function Items(){
const [items,setItems] = React.useState(List);
return (
<>
<h1>{items.length} Items in total</h1>
{items.map((itemArr) => {
return (
<ItemList {...itemArr} setItems={setItems} /> // <-- pass callback
)
})}
</>
)
}
并在孩子身上消耗掉道具。使用功能状态更新来访问前一个状态,过滤它并返回下一个状态。
function ItemList(props) {
const { id, obj, setItems } = props; // <-- destructure from props
const removeItem = (id) =>{
setItems(items => items.filter(item => item.id !== id)) // <-- update state
}
return (
<div>
<h3>{id}</h3>
<h4>{obj}</h4>
<button onClick={() => removeItem(id)}>Remove</button>
</div>
)
}
通常,尽管最好让拥有状态的组件也维护在该状态上运行的所有功能。换句话说,您应该removeHandler
在父级中定义并传递对它的引用。这允许并使保持状态不变成为父组件的责任,而不是任何子组件的责任。
function Items(){
const [items,setItems] = React.useState(List);
const removeItem = (id) =>{
setItems(items => items.filter(item => item.id !== id))
}
return (
<>
<h1>{items.length} Items in total</h1>
{items.map((itemArr) => {
return (
<ItemList {...itemArr} removeItem={removeItem} />
)
})}
</>
)
}
function ItemList(props) {
const { id, obj, removeItem } = props;
return (
<div>
<h3>{id}</h3>
<h4>{obj}</h4>
<button onClick={() => removeItem(id)}>Remove</button>
</div>
)
}
推荐阅读
- r - 如何选择 group_by 之后未汇总的列?
- google-apps-script - 如何修改当前插入时间戳脚本以在清除单元格时删除时间戳
- c# - .Net Core - 实体框架核心迁移 - 生产
- javascript - 防止 amcharts 系列重叠
- swift - 将 SKEmitterNode 设置为背景
- silverstripe - Silverstripe Userform 和表单问题提交按钮值消失
- python - 文本和二进制模式正则表达式搜索是否总是返回相同的结果?
- python-3.x - 用 python 爬行 Craiglisht(不是 Scrapy)
- java - 使用 SBT 将工件发布到本地 maven 仓库并在 Gradle 项目中使用
- python - 将用户输入值存储在另一个脚本的文件中