react js中的useState初始化错误

时间:2020-03-09 02:34:03

标签: reactjs

我正在尝试创建一个小的表格,该表格汇总了添加功能的各种成本。我正在通过useState和Forms进行此操作。我在useEffect中遇到的普遍错误称它是初始化之前尝试访问的错误。

所需的公式将从表单中获取输入,修改价格并将其显示在屏幕底部。这是整个功能:

import React, { Fragment, useState, useEffect } from "react";

const ToolSelect = () => {
 const number = 0;
 const services = [];

 useEffect(() => {
  setPrice(0);
 }, []);

 useEffect(() => {
  if (type === "cash") {
   setPrice(number * 1.1);
  } else if (type === "accrual") {
   setPrice(number * 1.2);
  }
 }, [number, setPrice]);

 useEffect(() => {
  setClicked(true);
  if (plan === "starter") {
   setPrice(1000);
  } else if (plan === "essential") {
   setPrice(2000);
  }
 }, [number, setPrice]);

 useEffect(() => {
  if (service === "tp") {
   services.push(service);
   setPrice(number + 800);
  } else if (service === "pr") {
   services.push(service);
   setPrice(number + 1000);
  } else if (service === "entity") {
   services.push(service);
   setPrice(number + 300);
  } else if (service === "compliance") {
   services.push(service);
   setPrice(number + 2000);
  }
 }, [number, setPrice]);

 const [price, setPrice] = useState(0);
 const [plan, setPlan] = useState("");
 const [type, setType] = useState("");
 const [service, setService] = useState("");
 const [clicked, setClicked] = useState(false);

 const onChange = e => {
  setPrice({ ...price, [e.target.name]: e.target.value });
  setPlan({ ...plan, [e.target.name]: e.target.value });
  setType({ ...type, [e.target.name]: e.target.value });
  setService({ ...service, [e.target.name]: e.target.value });
 };

 const onSubmit = e => {
  e.preventDefault();
 };

 return (
  <Fragment>
   <div className='container bg-dark grid-3'>
    <div>
     <ul>
      <li className='card bg-success'>
       <p className='lead all-center'>Package Type</p>
      </li>
      <li className='card bg-success'>
       <p className='lead all-center'>Onboarding fee</p>
      </li>
      <li className='card bg-success py-2'>
       <p className='lead all-center'>Accounting Type</p>
      </li>
      <li className='card bg-success py-3'>
       <p className='lead all-center'>Additional Services</p>
      </li>
     </ul>
    </div>
    <div>
     <form onSubmit={onSubmit}>
      <ul>
       <li className='card bg-light'>
        <button
         onClick={() => setPlan("starter")}
         className='btn btn-primary btn-block'>
         Starter
        </button>
       </li>
       <li className='card bg-light'>
        <h3 className='lead all-center'>
         <span className={plan === "starter" ? "text-primary" : "text-dark"}>
          $1000
         </span>
        </h3>
       </li>
       <li className='card bg-light'>
        <h5 className='all-center'>1-20 Transactions Per Month</h5>
        <span className='text-center px-1'>
         <span className='text-center bg-success px-3'>
          <input
           type='radio'
           name='type'
           value='cash'
           checked={type === "cash"}
           onChange={onChange}
          />
          Cash{"   "}
         </span>
         <span className='text-center bg-danger px-3'>
          <input
           type='radio'
           value='accrual'
           name='type'
           checked={type === "accrual"}
           onChange={onChange}
          />
          Accrual
         </span>
        </span>
       </li>
       <li className='card bg-light'>
        <input
         type='checkbox'
         name='tp'
         checked={service === "tp"}
         onChange={onChange}
        />
        Tax Preparation{"  "}
        <input
         type='checkbox'
         name='service'
         value='pr'
         checked={service === "pr"}
         onChange={onChange}
        />
        Payroll {"  "}
        <br />
        <input
         type='checkbox'
         name='service'
         value='entity'
         checked={service === "entity"}
         onChange={onChange}
        />
        Entity Filings {"  "}
        <input
         type='checkbox'
         name='service'
         value='compliance'
         checked={service === "compliance"}
         onChange={onChange}
        />
        Compliance {"  "}
       </li>
      </ul>
     </form>
    </div>
    <div>
     <form onSubmit={onSubmit}>
      <ul>
       <li className='card bg-light'>
        <button
         onClick={() => setPlan("essential")}
         className='btn btn-danger btn-block'>
         Essential
        </button>
       </li>
       <li className='card bg-light'>
        <h3 className='lead all-center'>
         <span className={plan === "essential" ? "text-danger" : "text-dark"}>
          $2000
         </span>
        </h3>
       </li>
       <li className='card bg-light'>
        <h5 className='all-center'>20-100 Transactions Per Month</h5>
        <span className='text-center px-1'>
         <span className='text-center bg-success px-3'>
          <input
           type='radio'
           name='type'
           value='cash'
           checked={type === "cash"}
           onChange={onChange}
          />
          Cash{"   "}
         </span>
         <span className='text-center bg-danger px-3'>
          <input
           type='radio'
           name='type'
           value='accrual'
           checked={type === "accrual"}
           onChange={onChange}
          />
          Accrual
         </span>
        </span>
       </li>
       <li className='card bg-light'>
        <input
         type='checkbox'
         name='service'
         value='tp'
         checked={service === "tp"}
         onChange={onChange}
        />
        Tax Preparation{"  "}
        <input
         type='checkbox'
         name='service'
         value='pr'
         checked={service === "pr"}
         onChange={onChange}
        />
        Payroll {"  "}
        <br />
        <input
         type='checkbox'
         name='service'
         value='entity'
         checked={service === "entity"}
         onChange={onChange}
        />
        Entity Filings {"  "}
        <input
         type='checkbox'
         name='service'
         value='compliance'
         checked={service === "compliance"}
         onChange={onChange}
        />
        Compliance {"  "}
       </li>
      </ul>
     </form>
    </div>
   </div>
   <div className='container bg-dark grid-4'>
    <div className='card bg-success'>
     <p className='lead all-center'>One Time Fee</p>
    </div>
    <div className='card bg-light'>{price}</div>
   </div>
  </Fragment>
 );
};

export default ToolSelect;

2 个答案:

答案 0 :(得分:1)

只需在功能组件的第一行声明您的状态变量,因为useEffect也会在第一行运行,并且它没有任何状态变量,因此会产生错误。

import React, { Fragment, useState, useEffect } from "react";

const ToolSelect = () => {

 const [price, setPrice] = useState(0);
 const [plan, setPlan] = useState("");
 const [type, setType] = useState("");
 const [service, setService] = useState("");
 const [clicked, setClicked] = useState(false);

 const number = 0;
 const services = [];

 useEffect(() => {
  setPrice(0);
 }, []);

 useEffect(() => {
  if (type === "cash") {
   setPrice(number * 1.1);
  } else if (type === "accrual") {
   setPrice(number * 1.2);
  }
 }, [number, setPrice]);

 useEffect(() => {
  setClicked(true);
  if (plan === "starter") {
   setPrice(1000);
  } else if (plan === "essential") {
   setPrice(2000);
  }
 }, [number, setPrice]);

 useEffect(() => {
  if (service === "tp") {
   services.push(service);
   setPrice(number + 800);
  } else if (service === "pr") {
   services.push(service);
   setPrice(number + 1000);
  } else if (service === "entity") {
   services.push(service);
   setPrice(number + 300);
  } else if (service === "compliance") {
   services.push(service);
   setPrice(number + 2000);
  }
 }, [number, setPrice]);

 const onChange = e => {
  setPrice({ ...price, [e.target.name]: e.target.value });
  setPlan({ ...plan, [e.target.name]: e.target.value });
  setType({ ...type, [e.target.name]: e.target.value });
  setService({ ...service, [e.target.name]: e.target.value });
 };

 const onSubmit = e => {
  e.preventDefault();
 };

 return (
  <Fragment>
   <div className='container bg-dark grid-3'>
    <div>
     <ul>
      <li className='card bg-success'>
       <p className='lead all-center'>Package Type</p>
      </li>
      <li className='card bg-success'>
       <p className='lead all-center'>Onboarding fee</p>
      </li>
      <li className='card bg-success py-2'>
       <p className='lead all-center'>Accounting Type</p>
      </li>
      <li className='card bg-success py-3'>
       <p className='lead all-center'>Additional Services</p>
      </li>
     </ul>
    </div>
    <div>
     <form onSubmit={onSubmit}>
      <ul>
       <li className='card bg-light'>
        <button
         onClick={() => setPlan("starter")}
         className='btn btn-primary btn-block'>
         Starter
        </button>
       </li>
       <li className='card bg-light'>
        <h3 className='lead all-center'>
         <span className={plan === "starter" ? "text-primary" : "text-dark"}>
          $1000
         </span>
        </h3>
       </li>
       <li className='card bg-light'>
        <h5 className='all-center'>1-20 Transactions Per Month</h5>
        <span className='text-center px-1'>
         <span className='text-center bg-success px-3'>
          <input
           type='radio'
           name='type'
           value='cash'
           checked={type === "cash"}
           onChange={onChange}
          />
          Cash{"   "}
         </span>
         <span className='text-center bg-danger px-3'>
          <input
           type='radio'
           value='accrual'
           name='type'
           checked={type === "accrual"}
           onChange={onChange}
          />
          Accrual
         </span>
        </span>
       </li>
       <li className='card bg-light'>
        <input
         type='checkbox'
         name='tp'
         checked={service === "tp"}
         onChange={onChange}
        />
        Tax Preparation{"  "}
        <input
         type='checkbox'
         name='service'
         value='pr'
         checked={service === "pr"}
         onChange={onChange}
        />
        Payroll {"  "}
        <br />
        <input
         type='checkbox'
         name='service'
         value='entity'
         checked={service === "entity"}
         onChange={onChange}
        />
        Entity Filings {"  "}
        <input
         type='checkbox'
         name='service'
         value='compliance'
         checked={service === "compliance"}
         onChange={onChange}
        />
        Compliance {"  "}
       </li>
      </ul>
     </form>
    </div>
    <div>
     <form onSubmit={onSubmit}>
      <ul>
       <li className='card bg-light'>
        <button
         onClick={() => setPlan("essential")}
         className='btn btn-danger btn-block'>
         Essential
        </button>
       </li>
       <li className='card bg-light'>
        <h3 className='lead all-center'>
         <span className={plan === "essential" ? "text-danger" : "text-dark"}>
          $2000
         </span>
        </h3>
       </li>
       <li className='card bg-light'>
        <h5 className='all-center'>20-100 Transactions Per Month</h5>
        <span className='text-center px-1'>
         <span className='text-center bg-success px-3'>
          <input
           type='radio'
           name='type'
           value='cash'
           checked={type === "cash"}
           onChange={onChange}
          />
          Cash{"   "}
         </span>
         <span className='text-center bg-danger px-3'>
          <input
           type='radio'
           name='type'
           value='accrual'
           checked={type === "accrual"}
           onChange={onChange}
          />
          Accrual
         </span>
        </span>
       </li>
       <li className='card bg-light'>
        <input
         type='checkbox'
         name='service'
         value='tp'
         checked={service === "tp"}
         onChange={onChange}
        />
        Tax Preparation{"  "}
        <input
         type='checkbox'
         name='service'
         value='pr'
         checked={service === "pr"}
         onChange={onChange}
        />
        Payroll {"  "}
        <br />
        <input
         type='checkbox'
         name='service'
         value='entity'
         checked={service === "entity"}
         onChange={onChange}
        />
        Entity Filings {"  "}
        <input
         type='checkbox'
         name='service'
         value='compliance'
         checked={service === "compliance"}
         onChange={onChange}
        />
        Compliance {"  "}
       </li>
      </ul>
     </form>
    </div>
   </div>
   <div className='container bg-dark grid-4'>
    <div className='card bg-success'>
     <p className='lead all-center'>One Time Fee</p>
    </div>
    <div className='card bg-light'>{price}</div>
   </div>
  </Fragment>
 );
};

export default ToolSelect;

答案 1 :(得分:0)

有人可以解释为什么我在尝试使用set状态时在调用字符串帐户对象时遇到错误

 useEffect(() => {
  if (accounts === "cash") {
   setPrice(price * 1.1);
  } else if (accounts === "accrual") {
   setPrice(price * 1.2);
  }
 }, [accounts, setPrice]);
          <input
           type='radio'
           name='accounts'
           value='cash'
           checked={accounts === "cash"}
           onChange={onChange}
          />
          Cash{"   "}
         </span>
         <span className='text-center bg-danger px-3'>
          <input
           type='radio'
           value='accrual'
           name='accounts'
           checked={accounts === "accrual"}
           onChange={onChange}
          />
          Accrual

其他等式

 setAccounts({ ...accounts, [e.target.name]: e.target.value });
 const [accounts, setAccounts] = useState("");