reactjs - 在复选框单击上 react 更新获取

标签 reactjs checkbox react-hooks fetch-api

我有一个组件(卡),它具有使用 Postgres 在本地主机数据库中跟踪的复选框。当我选中或取消选中该框时,一个条目将被放入网络用户表中。问题是,当我选中或取消选中该框,然后单击按钮呈现不同的组件,然后返回带有复选框的 Card 组件时,这些框不会显示更新的检查。但是,如果我注销并重新登录,所有框都会更新并与数据库同步。那么,一旦以下组件中的复选框发生更改,如何让组件立即渲染(或再次获取?)? TY。

import React, { useState } from "react";

const onUpdateCB = (ischecked, loginuser, userid, setisChecked,handleCheck,event) => {

  console.log(ischecked, loginuser, userid);

  fetch('http://localhost:3000/cb', {
      method: 'post',
      headers: {'Content-Type':'application/json'},
      body:JSON.stringify({
      loginuser,
      userid,
      ischecked: ischecked
    })
  }).then(setisChecked(ischecked)); 
};

const Card = props => {
  const [isChecked, setisChecked] = useState(props.ischecked);
  return (
    <div
      className="pointer bg-light-green dib br3 pa3 ma2 shadow-5"
      onClick={() => props.handleClick(props.id)}
      //onClick={(e) => e.stopPropagation()}

    >
      <div>
        <h3>{props.name}</h3>
        <p>{props.company}</p>
        <p>{props.phone}</p>
        <p>{props.email}</p>
        <p>{props.city}</p>
      </div>
      <div>
        My Network
        <input
          className="largeCheckbox"
          type="checkbox"
          checked={isChecked}
          onClick={(event) =>
            onUpdateCB(!isChecked, props.loginuser.id, props.id, setisChecked,event.stopPropagation())
          }
        />
      </div>
    </div>
  );
};

export default Card;

网络阵列

import React from "react";
import Card from "./Card";

const NetworkArray = ({
  network,
  networkusers,
  handleChange,
  handleClick,
  loginuser
}) => {
  console.log("in network array", networkusers);

  const cardComponent = network.map((user, i) => {
    const ischecked = networkusers.filter(n => {
      var nw = n.id === loginuser.id && n.connections === network[i].id;
      return nw;
    });



    console.log("i'm checked", ischecked);

    return (

      <Card
        key={network[i].id}
        name={network[i].firstname + " " + network[i].lastname}
        company={network[i].company}
        phone={network[i].phone}
        email={network[i].email}
        city={network[i].city}
        ischecked={ischecked.length}
        handleChange={handleChange}
        handleClick={handleClick}
        id={network[i].id}
        loginuser={loginuser}
      />
    );
  });
  return <div>{cardComponent}</div>;
};

export default NetworkArray;

最佳答案

首先,在 React 应用程序中您必须遵循两个原则。

<强>1。不要在任何应用程序状态中存储两个事实来源。 目前,卡存储其自己的状态 isChecked,并且 Network 上方的某个位置已从数据库获取值并将 isChecked 传递给卡组件也是如此。

拥有多个事实来源并不好,并且通常会在以后困扰我们,所以规则第一。,不要有多个事实来源

修复#1:从卡中删除“isChecked”状态。

import React, { useState } from "react";

const onUpdateCB = (ischecked, loginuser, userid) => {

  console.log(ischecked, loginuser, userid);

  fetch('http://localhost:3000/cb', {
    method: 'post',
    headers: {'Content-Type':'application/json'},
    body:JSON.stringify({
      loginuser,
      userid,
      ischecked: ischecked
    })
  }); 
};

const Card = props => {
  const { ischecked } = props;
  return (
    <div
      className="pointer bg-light-green dib br3 pa3 ma2 shadow-5"
      onClick={() => props.handleClick(props.id)}
      //onClick={(e) => e.stopPropagation()}
    >
      <div>
        <h3>{props.name}</h3>
        <p>{props.company}</p>
        <p>{props.phone}</p>
        <p>{props.email}</p>
        <p>{props.city}</p>
      </div>
      <div>
        My Network
        <input
          className="largeCheckbox"
          type="checkbox"
          checked={ischecked}
          onClick={(event) =>
            onUpdateCB(!isChecked, props.loginuser.id, props.id)
          }
        />
      </div>
    </div>
  );
};

export default Card;

....实际上第一个主体应该足以解决你的问题。但如果你好奇的话。

<强>2。在渲染后产生副作用(componentDidMount、componentDidUpdate、useEffect)。

流程应该是这样的, 事件 => setState => 渲染 => 副作用

  1. 用户与某物交互(点击、按下、触摸、聚焦等)
  2. 您为状态设置新值(或传递 Prop ,设置父级的状态...相同相同)
  3. 您进行更改
  4. 在渲染生命周期/ Hook 之后,您执行副作用(例如 API 调用)

假设您的卡片组件是独立的,不会从 Prop 中获得值(value)。

const onUpdateCB = (ischecked, loginuser, userid) => {
  return fetch('http://localhost:3000/cb', {
    method: 'post',
    headers: {'Content-Type':'application/json'},
    body:JSON.stringify({
      loginuser,
      userid,
      ischecked: ischecked
    })
  }); 
}

const Card = props => {
  const [data, setData] = useState({});

  // 2: set new state
  const onSelectCheckbox = (ischecked) => {
    const newData = { ...data, ischecked };
    setData(newData);
  }

  useEffect(() => {
    // 4. Watch if data.ischecked change, if yes perform side effect (call api)
    onUpdateCB(data.ischecked, props.loginuser.id, props.id);
  }, [data.ischecked]);

  // 3. re-render when data change.
  const { name, company, phone, email, city, ischecked } = data;
  return (
    <div className="pointer bg-light-green dib br3 pa3 ma2 shadow-5">
      <div>
        <h3>{name}</h3>
        <p>{company}</p>
        <p>{phone}</p>
        <p>{email}</p>
        <p>{city}</p>
      </div>
      <div>
        My Network
        <input
          className="largeCheckbox"
          type="checkbox"
          checked={ischecked}
          onClick={(event) =>
            onSelectCheckbox(!isChecked) // 1. User interact with checkbox
          }
        />
      </div>
    </div>
  );
};

关于reactjs - 在复选框单击上 react 更新获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59097560/

相关文章:

javascript - AngularJS ng-true-value 不适用于 v1.6.1

c# - 使用 DisplayFor 启用 CheckBox

javascript - 使用 JQuery 多选取消选择复选框

javascript - Ant Design,如何自定义Steps组件

reactjs - 根据为另一个 prop 提供的值键入一个 prop

javascript - enzyme 单击组件​​内的按钮 组件内

reactjs - React - 跨组件共享功能的最佳实践

javascript - 在 React 的 Div 中拖动图像时如何防止在新选项卡中打开

javascript - 为什么这个 useEffect (第一个)不会在依赖项更改时运行?

javascript - 异步调用后在 React 中重新渲染状态