在功能组件 React native 中即时创建对列表视图中项目的引用
Create referece to items in list view on fly in functional component React native
我正在使用来自
React Native Elements and have added a cheakbox:
{items.map((l, i) => (
<ListItem.Swipeable
key={i}
<ListItem.CheckBox
iconType='material'
checkedIcon='clear'
uncheckedIcon='add'
checkedColor='red'
checked={false}
//onPress={something} Need to write (call here) function here that will change checked state and do other stuff
/>
<ListItem.Content>
<ListItem.Title>
{l.time}
</ListItem.Title>
</ListItem.Content>
<ListItem.Chevron />
</ListItem.Swipeable>
))}
我需要能够按下 ListItem.CheckBox 并更改选中状态以及获取映射的 l
对象的值。
我知道如何将 l
对象从印刷机上的映射数组传递给某个函数,但不知道如何将 return 值传递给 checked={false}
,如果可能的话用这个元素做更多的事情。
我已经阅读了很多关于 refs 的文章,几乎所有都是关于基于 class 的组件以及关于为特定元素手动创建 refs 的。这里的问题是这是一个映射到列表视图的元素数组,所以这需要在 flay 上完成。
请记住,复选框文档中的示例不适用于功能组件。
示例:checked={this.state.checked}
这样做的目的是能够 select 列表中的多个项目并对与之关联的对象执行一些操作。
不胜感激。
本机反应:0.63.2
您可以管理父组件的所有状态,同时为每个子组件提供对 setState
(或内部使用 setState
的函数)的引用。您可以将列表中每个对象的 checked
作为 prop 发送到每个相应的子组件。这样,由于状态保存在父组件中,每个状态变化都会反映在 UI 上。
示例组件:
import { useState } from 'react'
const DEFAULT_ITEMS = [
{ id: "id_akdjk", label: "quora", checked: false },
{ id: "id_xlhwi", label: "library", checked: false },
{ id: "id_xoqix", label: "reddit", checked: true }
]
const ListItem = ({ label, checked, change }) => {
return(
<div>
<input type="checkbox" onChange={change} checked={checked}/>
<label htmlFor="vehicle1">{label}</label><br/>
</div>
)
}
export default function Component() {
const [items, setItems] = useState(DEFAULT_ITEMS)
const handleInputChange = (index) => {
// manipulate copy of state. (not state itself)
const copyState = [...items]
// updating that specific indice
copyState.splice(index,
1,
{...items[index], checked: !items[index]["checked"]})
setItems(copyState)
}
return (
<div>
{ items.map((el, i) => {
return <ListItem
key={i}
label={el.label}
checked={el.checked}
change={() => handleInputChange(i)}/>
})}
<div>
<p>You chose:</p> { items.map((el) => el.checked ? el.label : '').join(' ') }
</div>
</div>
)
}
所以你的 onPress
将是:
// assuming you are using this data as the state
const DEFAULT_ITEMS = [
{ id: "id_akdjk", checked: false },
{ id: "id_xlhwi", checked: false },
{ id: "id_xoqix", checked: false }
]
...
const [items, setItems] = useState(DEFAULT_ITEMS)
const handleInputChange = (index) => {
// manipulate copy of state. (not state itself)
const copyState = [...items]
// updating that specific indice
copyState.splice(index,
1,
{...items[index], checked: !items[index]["checked"]})
setItems(copyState)
}
//...
onPress={() => handleInputChange(i)}
P.S。使用索引来更新状态不是一个好主意。每个对象都有一个 id
是更好的做法
我正在使用来自 React Native Elements and have added a cheakbox:
{items.map((l, i) => (
<ListItem.Swipeable
key={i}
<ListItem.CheckBox
iconType='material'
checkedIcon='clear'
uncheckedIcon='add'
checkedColor='red'
checked={false}
//onPress={something} Need to write (call here) function here that will change checked state and do other stuff
/>
<ListItem.Content>
<ListItem.Title>
{l.time}
</ListItem.Title>
</ListItem.Content>
<ListItem.Chevron />
</ListItem.Swipeable>
))}
我需要能够按下 ListItem.CheckBox 并更改选中状态以及获取映射的 l
对象的值。
我知道如何将 l
对象从印刷机上的映射数组传递给某个函数,但不知道如何将 return 值传递给 checked={false}
,如果可能的话用这个元素做更多的事情。
我已经阅读了很多关于 refs 的文章,几乎所有都是关于基于 class 的组件以及关于为特定元素手动创建 refs 的。这里的问题是这是一个映射到列表视图的元素数组,所以这需要在 flay 上完成。
请记住,复选框文档中的示例不适用于功能组件。 示例:checked={this.state.checked}
这样做的目的是能够 select 列表中的多个项目并对与之关联的对象执行一些操作。
不胜感激。
本机反应:0.63.2
您可以管理父组件的所有状态,同时为每个子组件提供对 setState
(或内部使用 setState
的函数)的引用。您可以将列表中每个对象的 checked
作为 prop 发送到每个相应的子组件。这样,由于状态保存在父组件中,每个状态变化都会反映在 UI 上。
示例组件:
import { useState } from 'react'
const DEFAULT_ITEMS = [
{ id: "id_akdjk", label: "quora", checked: false },
{ id: "id_xlhwi", label: "library", checked: false },
{ id: "id_xoqix", label: "reddit", checked: true }
]
const ListItem = ({ label, checked, change }) => {
return(
<div>
<input type="checkbox" onChange={change} checked={checked}/>
<label htmlFor="vehicle1">{label}</label><br/>
</div>
)
}
export default function Component() {
const [items, setItems] = useState(DEFAULT_ITEMS)
const handleInputChange = (index) => {
// manipulate copy of state. (not state itself)
const copyState = [...items]
// updating that specific indice
copyState.splice(index,
1,
{...items[index], checked: !items[index]["checked"]})
setItems(copyState)
}
return (
<div>
{ items.map((el, i) => {
return <ListItem
key={i}
label={el.label}
checked={el.checked}
change={() => handleInputChange(i)}/>
})}
<div>
<p>You chose:</p> { items.map((el) => el.checked ? el.label : '').join(' ') }
</div>
</div>
)
}
所以你的 onPress
将是:
// assuming you are using this data as the state
const DEFAULT_ITEMS = [
{ id: "id_akdjk", checked: false },
{ id: "id_xlhwi", checked: false },
{ id: "id_xoqix", checked: false }
]
...
const [items, setItems] = useState(DEFAULT_ITEMS)
const handleInputChange = (index) => {
// manipulate copy of state. (not state itself)
const copyState = [...items]
// updating that specific indice
copyState.splice(index,
1,
{...items[index], checked: !items[index]["checked"]})
setItems(copyState)
}
//...
onPress={() => handleInputChange(i)}
P.S。使用索引来更新状态不是一个好主意。每个对象都有一个 id
是更好的做法