React 视图不会在状态更改时更新

拉斯穆斯·安徒生

我有一个要渲染的名称列表。该列表由搜索输入过滤,但也由gender_id 过滤。

问题是,当我更新数组中对象的 saved_id 时,视图不会改变。我的子组件有一个按钮,如果 saved_id 为 1,则输出“Save”,如果 saved_id 为 2,则输出“Remove”。我可以在更新状态后控制台.log 'names'- 和 'searchFilteredNames'-arrays,并且都得到更新。但是我使用 .map() 来呈现列表的 const'genderFilteredNames' 由于某种原因没有捕捉到变化......为什么会这样?

父组件(带名称的表):

export default function Names(props) {
/* Raw list */
const [names, setNames] = useState([]);

/* Search filtered list */
const [searchFilteredNames, setSearchFilteredNames] = useState([...names]);

/* Gender filter */
const [genderFilter, setGenderFilter] = useState(1);

/* Show only names where gender_id is equal to gender filter AND status === 1 */
const genderFilteredNames = searchFilteredNames.filter((name) => {
  return name.status_id === 1 && name.gender_id === genderFilter;
});

/* Get names from Database on render */
useEffect(() => {
  getNames();
}, []);

/* Update search-filtered array on root array update */
useEffect(() => {
  setSearchFilteredNames(names);
}, [names]);

/* Get names */
function getNames() {
  axios.get("http://localhost:3001/select").then((response) => {
    setNames(response.data);
  });
}

/* Update object in array */
function updateSave(id, savedId) {
  // Make copy of original array
  let newNames = [...names];

  // Get index of object to update
  for (var index = 0; index < names.length; index++) if (names[index].id === id) break;

  // Update object value
  newNames[index].saved_id = savedId;

  // Set the state to new copy
  setNames(newNames)
}

/* Render names */
function renderNames() {
  return genderFilteredNames.map((name) => (
    <Name
      key={name.id}
      id={name.id}
      name={name.name}
      saved={name.saved_id}
      gender_id={name.gender_id}
      use={() => handleUse(name.id)}
      save={() => handleSave(name.id)}
    />
  ));
}
...

子组件(单行):

export default function Name(props) {
  const [name, setName] = useState(props.name);
  const [saved, setSaved] = useState(props.saved);
  const useFn = props.use;
  const saveFn = props.save;

  function savedStatus() {
    return saved === 1 ? <>Save</> : <>Remove</>;
  }

  return (
    <>
      <tr>
        <td>{name}</td>
        <td className="actions-2">
          <button className="btn btn-tan" onClick={useFn}>
            <FaRegEdit />
            Use
          </button>

          <button className="btn btn-tan" onClick={saveFn}>
            <GiSaveArrow />
            {savedStatus()}
          </button>
        </td>
      </tr>
    </>
  );
}
拉斯穆斯·安徒生

我意识到为什么它不起作用......我在子组件中使用 useState 作为 saved_status,而不是用 setState 更新它......

在这里:

export default function Name(props) {
const [name, setName] = useState(props.name); 
const [saved, setSaved] = useState(props.saved);***** HERE ******

改为:

export default function Name(props) {
const name = props.name;
const saved = props.saved;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

React JS组件不会在状态更改时更新

React useCallback不会在状态更改时更新

React组件不会在状态更改时重新呈现

React不会在状态更改时重新呈现

React useContext 不会在状态更改时重新渲染

Bootstrap v4 popover不会在React中的状态更改时更新

React Native:基于Array.map()的渲染组件不会在状态更改时更新

状态不会在路由更改时重置-React-redux-router

React-redux组件不会在商店状态更改时重新呈现

React 功能组件不会在状态更改时重新渲染

React Redux-子组件不会在状态更改时重新呈现

React / Redux组件不会在状态更改时重新呈现

React子组件不会在状态更改时重新呈现

React + Redux:组件不会在状态更改时重新呈现

React 不会在状态和道具更改时重新渲染

动态呈现的 React 组件不会在父状态更改时重新呈现

React Native ListView不会在数据更改时更新

数组中的React Child组件不会在prop更改时更新

React组件不会在道具更改时重新渲染

React不会在道具更改时重新渲染

React useEffect不会在路线更改时触发

React Native 不会在 DOM 更改时重新渲染

React 组件不会在更新状态时更新

React不会在useEffect上更新状态

React不会在路线参数更改或查询更改时重新加载组件数据

React-navigation 不会在更改时以编程方式更改标题颜色

react-file-viewer 不会在 filePath 更改时加载新文档

React Webpack捆绑器不会在文件更改时重新编译

React Router - 页面不会在路由更改时重新呈现