【问题标题】:How to api call in onChange function on CheckBox field React js如何在CheckBox字段React js上调用onChange函数
【发布时间】:2021-01-12 18:30:41
【问题描述】:

我想在更改复选框输入时调用 post API? 现在我在下面的模式中这样做但是当组件重新渲染这个 API 函数被调用了?请问怎么办?

 const [check, setCheck] = useState();
 
  async function fetchConfigApi() {
    try {
       const result = await axios.get(`/configuration/${system_id}`);
       const { status, data } = result;
       setConfigData(data);
       setCheck(data.self_service);
    } catch (e) {
      console.log("error response", e.response);
    }  
  }

  async function postSelfService() {
   try {
      const fd = new FormData();
      fd.append("self_service", check);
      const result = await axios.put(`/configuration/${system_id}`, fd);
      fetchConfigApi();
    } catch (e) {
      console.log("error response", e.response);
    }   
  }  

  const onSelfServiceChange = (e) => { setCheck(!check); };

  useEffect(() => { fetchConfigApi(); }, []);

  useEffect(() => { postSelfService(); }, [check]);

return (
    <div className={classes.subContainer}>
        <div>
          <FormControlLabel
            control={
               <Checkbox
                checked={check}
               onChange={onSelfServiceChange}
                 name="check"
               />
             }
             label="Enable Self Service"
           />    </div> )

【问题讨论】:

    标签: javascript reactjs api checkbox onchange


    【解决方案1】:

    只需删除第二个 useEffect 并将您的 API 调用放入 onChange 函数中,如下所示:

    为了更好的用户体验并避免不必要的调用,您应该在用户点击获取结果时被禁用的复选框时添加加载状态,然后根据响应选中或取消选中。

    const App = () => {
      const [data, setConfigData] = React.useState(false);
      const [check, setCheck] = React.useState(false);
      const [loading, setLoading] = React.useState(true);
    
      function fetchConfigApi() {
        try {
          // simulate api call
          setTimeout(()=> {
            setConfigData("new data on: "+ new Date() )
            setCheck(prev=>!prev);
            setLoading(false);
          },500)
        } catch (e) {
          console.log("error response", e.response);
        }
      }
    
      function postSelfService() {
        try {
          // simulate api call
          setTimeout(()=> fetchConfigApi(),500)
        } catch (e) {
          console.log("error response", e.response);
        }
      }
    
      const onSelfServiceChange = (e) => {
        setLoading(true);
        postSelfService();
      };
    
      React.useEffect(() => {
        fetchConfigApi();
      }, []);
    
      return (
        <div>
            <label>
              <input
                type="checkbox"
                checked={check}
                onChange={onSelfServiceChange}
                name="check"
                disabled={loading}
              />
              Enable Self Service 
            </label>
            <hr/>
            <p>{loading ? "loading..." : data}</p>
        </div>
      );
    }
    
    ReactDOM.render(<App />, document.getElementById("react"));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
    <div id="react"></div>

    【讨论】:

    • 最初我已经尝试过,但问题是当我从 api 获取此检查数据并将其放入我的复选框时,它总是显示 cheked。但是,当我检查并添加另一个保存按钮以点击 post api 时,它工作正常。如果你知道问题,请告诉我。谢谢
    • 哦,是的,我看到我们给setCheck 打了两次电话。我确实通过在用户单击复选框时添加加载状态,在获取结果时禁用,然后根据响应选中或取消选中复选框来使我的答案更好。
    • 兄弟,感谢您的帮助。但即使它不起作用。
    • 这里我给你举个例子。
    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多