在使用useReducer时如何在React js中进行优化,循环传递给子组件的状态

Vijayashankar Aruchamy

我正在尝试创建待办事项列表。

function App() {
  return (
    <div className="App">
      <UseReducerToDo/>
    </div>
  );
}

const { useReducer, useState } = React;

const reducer = (state, action) => {
  return [...state, { id: Date.now(), ToDo: action, completed: false }];
};

function UseReducerToDo() {
  const [state, dispatch] = useReducer(reducer, []);
  const [Todo, setTodo] = useState("");

  const addToTODO = (e) => {
    e.preventDefault();
    dispatch(Todo);
  };

  return (
    <div>
      <form onSubmit={addToTODO}>
        <input
          type="text"
          value={Todo}
          onChange={(e) => setTodo(e.target.value)}
        ></input>
      </form>
      {state.length > 0
        ? state.map((todo) => <DispToDo key={todo.id} todo={todo} />)
        : "no pending items"}
    </div>
  );
}

function DispToDo({ todo }) {
  console.log("DispToDo", todo);
  return (
    <div>
      <p>
        {todo.ToDo + "->"} status {todo.completed ? "done" : "pending"}
      </p>
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>

现在,代码可以编译并正常工作了。问题与性能有关。

当应用程序运行时 初始画面

当第一个元素被添加并提交时 在添加第一个元素之后

现在弹出实际问题 每次按键后

我已经发现,文本框中的每个按键都会刷新子组件DispToDo这很明显,因为控制台中的日志是为每个按键添加的。

中没有变化,state但有刷新DispToDo

有什么办法可以优化这个?

帕特里克·罗伯茨

您可以state.map()使用useMemo()钩子来记住自己

const todos = useMemo(() => (
  state.map((todo) => <DispToDo key={todo.id} todo={todo} />)
), [state]);

请参阅下面的完整演示:

function App() {
  return (
    <div className="App">
      <UseReducerToDo/>
    </div>
  );
}

const { useMemo, useReducer, useState } = React;

const reducer = (state, action) => {
  return [...state, { id: Date.now(), ToDo: action, completed: false }];
};

function UseReducerToDo() {
  const [state, dispatch] = useReducer(reducer, []);
  const [Todo, setTodo] = useState("");

  const addToTODO = (e) => {
    e.preventDefault();
    dispatch(Todo);
  };
  
  const todos = useMemo(() => (
    state.map((todo) => <DispToDo key={todo.id} todo={todo} />)
  ), [state]);

  return (
    <div>
      <form onSubmit={addToTODO}>
        <input
          type="text"
          value={Todo}
          onChange={(e) => setTodo(e.target.value)}
        ></input>
      </form>
      {state.length > 0 ? todos : "no pending items"}
    </div>
  );
}

function DispToDo({ todo }) {
  console.log("DispToDo", todo);
  return (
    <div>
      <p>
        {todo.ToDo + "->"} status {todo.completed ? "done" : "pending"}
      </p>
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将useReducer状态传递给子组件?

如何确定传递给子组件的状态

如何在 React 中更新 useReducer 状态?

如何将子组件的状态传递给父组件?

如何将状态与父组件传递给子组件

当将状态作为道具传递给子组件时,React如何维护状态封装?

在React中将新状态传递给子组件

将道具传递给子组件作为React中的状态

如何将异步状态传递给子组件prop?

如何将父状态传递给其子组件?

当子组件作为属性传递时,反应状态不会更新/传递给子组件

如何在 usereducer react/ts 中翻转状态

React JS 将数据或子组件传递给父组件

Graphql,React-Apollo如何在加载组件状态时将变量传递给查询

如何在useReducer中进行API调用?

如何将数据从子组件(子组件有自己的状态)传递给父组件?

如何在 REACT 中的子组件中进行对象解构

反应:如何将状态传递给子组件并调用子组件中的函数以使用此状态

如何在React中将值传递给子组件

使用 React Router 时如何将方法和状态传递给嵌套组件?

React:传递给子组件的状态在父组件中更改时不会更新

如何在页面呈现时将更新后的状态传递给子组件?

如何在设置之前停止将状态元素传递给子组件?

使用父组件将初始值传递给子组件,而无需依赖状态ReactJS

在Enzyme中进行单元测试的React无状态组件,该组件被withRouter()包装,如何传递匹配参数

如何在使用 mysql 数据库时在 react js 中进行编辑

如何在 React 中使用 CSS 模块将多个类动态传递给子组件

如何在 Vue.js 中将数据从父组件传递给子组件?

如何在React JS中使用useState更改单击特定组件时的状态?