简体   繁体   English

将 useState 变量从一个 JSX 文件传递​​到另一个文件时出现问题

[英]Problem while passing useState variable from one JSX file to another

(CreateColumn.jsx) (CreateColumn.jsx)

import React, { useState, useEffect } from "react";
import Axios from "axios";
import "./styles.css";
function CreateColumn() {

  let [val1, setVal1] = useState("0");
  let [val2, setVal2] = useState("0");
  let [secName, setSecName] = useState("");
  let [goAttendance, setGoAttendance] = useState(0);

  function valueChanged(event) {
    const checkChecked = event.target.id;
    // console.log(checkChecked);
    if (checkChecked === "section1") {
      setVal1("1");
      setVal2("0");
      setSecName("Section 1");
    } else if (checkChecked === "section2") {
      setVal2("1");
      setVal1("0");
      setSecName("Section 2");
    } else {
      setVal1("0");
      setVal2("0");
      setSecName("");
    }
  }
    useEffect(() => {
      Axios.get("http://localhost:9000/createColumn").then((response) => {
        setSecName(response.data);
      });
    }, []);

  function sendColumn(event) {
    setGoAttendance(1);
    Axios.post("http://localhost:9000/createColumn", { secName, goAttendance });
  }

  return (
    <div>
      <form className="form-body">
        <div className="form-check check-line center-col">
          <input
            className="form-check-input"
            type="checkbox"
            id="section1"
            name="section"
            value={val1}
            checked={val1 === "1"}
            onChange={valueChanged}
          />
        </div>

        <div className="form-check check-line center-col">
          <input
            className="form-check-input"
            type="checkbox"
            id="section2"
            name="section"
            value={val2}
            checked={val2 === "1"}
            onChange={valueChanged}
          />
        </div>
        <div className="submit-btn d-grid gap-2 d-md-flex justify-content-md-center">
          <button
            type="submit"
            className="btn btn-lg btn-primary"
            onClick={sendColumn}
          >
            Create
          </button>
        </div>
      </form>
    </div>
  );
}

export default CreateColumn;

(Attendance.jsx) (出席.jsx)

import React, { useState, useEffect } from "react";
import Axios from "axios";
import TableTitle from "./TableTitle";
import Pagination from "./Pagination";
import "./styles.css";

function Attendance() {
  const [attedanceList, setAttedanceList] = useState([]);

  useEffect(() => {
    Axios.get("http://localhost:9000/attendance/" + ****WANT TO USE secName FROM CreateColumn.jsx HERE****).then(
      (response) => {
        setAttedanceList(response.data.data.values);
      }
    );
  }, []);

  function sendAllValues(event) {
    Axios.post("http://localhost:9000/attendance", { attedanceList });

  }

  return (
    <form className="form-body">
      <TableTitle />
      <Pagination data={attedanceList} />
      <div className="submit-btn d-grid gap-2 d-md-flex justify-content-md-center">
        <button
          type="submit"
          className="btn btn-lg btn-primary"
          onClick={sendAllValues}
        >
          Submit
        </button>
      </div>
    </form>
  );
}

export default Attendance;

(App.jsx) (应用程序.jsx)

import React, { useState } from "react";
import Attendance from "./Attendance";
import CreateColumn from "./CreateColumn";

function App() {
  return (
    <div>
      <CreateColumn />
      **WANT TO USE goAttendance FROM CreateColumn.jsx HERE** && <Attendance />
    </div>
  );
}

export default App;

I wanna use useState variables (secName and goAttendance) from Column.jsx in Attendance.jsx and App.jsx (where I have marked as WANT TO USE... ).我想在 Attendance.jsx 和 App.jsx 中使用来自 Column.jsx 的 useState 变量(secName 和 goAttendance)(我已标记为WANT TO USE... )。 How is it possible?这怎么可能?

More precisely, I wanna use secName from Column.jsx into Attendance.jsx.更准确地说,我想将secName中的 secName 用于 Attendance.jsx。 Also, I wanna use goAttendance from Column.jsx into App.jsx另外,我想将goAttendance中的 goAttendance 用于 App.jsx

I tried so many things for hours but sometimes it breaks my code or simply have to change a lot which makes the code more messy and buggy.我花了几个小时尝试了很多东西,但有时它会破坏我的代码,或者只是不得不进行大量更改,这使得代码更加混乱和错误。

As I can see CreateColumn and Attendence are the child components of App.我可以看到 CreateColumn 和 Attendence 是 App 的子组件。 You want to create a state and use it in app where as you want to set it in its child component.您想创建一个状态并在应用程序中使用它,因为您想在其子组件中设置它。 What I will suggest is to create the state and setState function on app level and then pass the state and setState function as props in the child component.我建议在应用程序级别创建 state 和 setState 函数,然后将 state 和 setState 函数作为子组件中的 props 传递。 I will suggest you to see this to know more about props.我建议您查看内容以了解有关道具的更多信息。

in app.jsx在 app.jsx 中

let [val1, setVal1] = useState("0");
let [val2, setVal2] = useState("0");
let [secName, setSecName] = useState("");
let [goAttendance, setGoAttendance] = useState(0);
const [attedanceList, setAttedanceList] = useState([]);
 
// while calling the components 
return(
<>
<CreateColumn val1={val1}, val2={val2}, secName={secName}, ....../>
<Attendance val1={val1}, val2={val2}, secName={secName}, ....../>
</>
)

in CreateColumn and Attendence while declaring the components write在 CreateColumn 和 Attendence 中,同时声明组件写入

function Attendance({val1, val2, secName, setVal1, ...})

and then use the states and setStates in app.jsx然后在 app.jsx 中使用 states 和 setStates

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM