从 React 中的 useEffect 挂钩更改复选框选中状态?

Posted

技术标签:

【中文标题】从 React 中的 useEffect 挂钩更改复选框选中状态?【英文标题】:Change a checkbox checked state from a useEffect hook in React? 【发布时间】:2021-11-06 10:14:57 【问题描述】:

context.number 的值为 1。我想根据 context.number 将输入检查值设置为 true。因此,如果 context.number 为 1,则选中 Module 1 的复选框,表明 Module 1 已完成。我只能从 onChange 事件中更改输入值,所以我假设我需要一个 useEffect 挂钩,以便在 context.number 更改时自动执行它?

import React,  useState, useContext, useEffect  from "react";
import  Link  from "react-router-dom";
import  AppContext  from "../context/AppContext";

export default function Menu() 

  const context = useContext(AppContext);

  //Determine the modules
  const modules = [
    
      title: `Introduction`,
      subtitle: "Lesson 1",
    ,
    
      title: `Overview`,
      subtitle: "Lesson 2",
    
  ];

  //Create a checked state for each module
  const [checkedState, setCheckedState] = useState(new Array(modules.length).fill(false));

  //Change checked value method
  const handleOnChange = (position) => 

    //map through checked states array, if position === mapped item index, flip the value
  const updatedCheckedState = checkedState.map((item, index) => (index === position ? 
  !item : item));

    //set that items state to the new value in the array
    setCheckedState(updatedCheckedState);
  ;

  return (
    <>
        <div>
            modules.map((module, index) => (
              <div className=styles.menuCard>
                <Link key=index to=`/Module/$index + 1`>
                  <h2>module.title</h2>
                  <p>module.subtitle</p>
                </Link>
                <input
                  id=`check$index`
                  type="checkbox"
                  onChange=() => handleOnChange(index)
                  checked=checkedState[index]
                />
              </div>
            ))
        </div>
    </>
  );

【问题讨论】:

真正的解决方案是将以下代码移动到上下文中并将状态保存在其中。 【参考方案1】:

我把这是我的上下文文件,并且能够让它工作。我意识到这是一个措辞不佳的问题,但仍然找到了我的答案。 useEffect 不是问题,而是每个复选框只保存本地状态,所以如果我呈现另一个页面,复选框又回到未选中状态。

import React,  createContext, useState  from "react";
const AppContext = createContext();

function AppProvider(props) 

  //Determine the modules
  const modules = [
    
      title: `Introduction`,
      subtitle: "Lesson 1",
    ,
    
      title: `Overview`,
      subtitle: "Lesson 2",
    
  ];

  //set module number state
  const [number, setNumber] = useState();
  //Create a checked state for each module
  const [checkedState, setCheckedState] = useState(new Array(modules.length).fill(false));

  //change module number method
  function completionHandler(value) 
    setNumber(value);
  

  //Change checked value method
  function handleChange(position) 
    const updatedCheckedState = checkedState.map((item, index) => (index == position ? !item : item));
    setCheckedState(updatedCheckedState);
  

  //export method and state value
  const value = 
    number: number,
    modules: modules,
    checkedState: checkedState,
    handleChange: handleChange,
    completionHandler: completionHandler,
  ;

  return <AppContext.Provider value=value>props.children</AppContext.Provider>;


export  AppContext, AppProvider ;

【讨论】:

以上是关于从 React 中的 useEffect 挂钩更改复选框选中状态?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用react中的useEffect挂钩从子级设置父级的状态

如何在 React 中使用 useEffect 挂钩调用多个不同的 api

仅当输入中的所有元素都更改时,如何使 useEffect 挂钩调用提供的效果?

反应:仅将主体类添加到 useEffect 挂钩中的某些组件?

无法使用 MaterialTable 中的 useEffect 挂钩显示数据

移动设备上的 React useEffect 挂钩未清除 setTimeout