仅更改对象列表中的一个图标 - React Native

Change only one icon in a list of objects - React Native

我希望能够将待办事项列表中的图标(参见图片)从感叹号更改为复选标记。如果用户将手指放在图标上,或者开发人员在模拟器中用鼠标单击,就会发生这种情况。

通过下面的代码,我设法对其进行了更改,但只有在关闭包含列表的模式并重新打开它时才会出现新图标。因此,模态框不会重新渲染,既不会部分渲染,也不会全部渲染。

如何在单击感叹号图标后立即显示更改?我怀疑它与状态有关,但似乎不可能在 map 函数内创建 React 挂钩。如果我让 onPress 调用一个函数,那么状态只能在那个外部函数中知道,我不知道如何导出它。

export const TeacherMessages = (props) => {
  return (
    <View
        style={[
        styles.borderBox,
        props.todos.length > 0 || props.notes.length > 0
            ? styles.whiteBox
            : null,
        ]}
    >
        {
            props.todos.map((todo) => (
                <View key={todo.id} style={styles.listNotes}>
                  <AntDesign
                      style={styles.listIcon}
                      onPress={() => todo.isChecked = true}
                      name={todo.isChecked ? "checksquare" : "exclamationcircle"}
                      color={todo.isChecked ? "green" : "red"}
                      size={18}
                  />
                  <Text style={styles.listText}> {todo.description}</Text>
                </View>
              ))
        }

);

我认为你需要将 todos 数组存储在一个反应​​钩子中,这样你对它所做的更改就会立即生效,你可以在父组件中拥有这个 changeTodo 函数并将它作为 props 传递以从中调用它具有所需索引的子组件。我认为这可能有帮助:

export const TeacherMessages = (props) => {
  const [todosArr, setTodosArr] = React.useState(props.todos)

  const checkTodo = (todoIndex) =>{
        let arr = [...todosArr]
        arr[todoIndex].isChecked= true
        setTodosArr(arr)
 }

  return (
    <View
        style={[
        styles.borderBox,
        todosArr.length > 0 || props.notes.length > 0
            ? styles.whiteBox
            : null,
        ]}
    >
        {
            todosArr.map((todo, index) => (
                <View key={todo.id} style={styles.listNotes}>
                  <AntDesign
                      style={styles.listIcon}
                      onPress={() => checkTodo(index)}
                      name={todo.isChecked ? "checksquare" : "exclamationcircle"}
                      color={todo.isChecked ? "green" : "red"}
                      size={18}
                  />
                  <Text style={styles.listText}> {todo.description}</Text>
                </View>
              ))
        }

);