当前位置: 首页 > 知识库问答 >
问题:

反应功能组件-遵循父组件状态

羊舌光赫
2023-03-14

我是新的反应,我正在尝试组件功能的风格。我有简单的待办事项清单。我想使用style属性从列表中删除todo项。从Chrome调试模式中,我看不到对复选框更改的即时反应,而且该项也没有删除。。。对我来说,这是如何管理组件状态的问题。我希望得到一些指导。

App.js

import React, {useState} from 'react';
import Todos from "./components/Todos";

import './App.css'

const App = () => {
    const [todos, setTodos] = useState(
        [
            {id: 1, title: 'Take out the trash', completed: false},
            {id: 2, title: 'Dinner with wife', completed: false},
            {id: 3, title: 'Meeting boss', completed: false}
        ]
    );

    const markComplete = id => {
        console.log((new Date()).toString());

        todos.map(todo => {
            if (todo.id === id) {
                todo.completed = ! todo.completed;
            }
            return todo;
        });
        setTodos(todos);
    };

    return (
        <div className="App">
            <Todos todos={todos} markComplete={markComplete}/>
        </div>
    );
};

export default App;

Todos.js

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

const Todos = ({todos, markComplete}) => {
    return (
        todos.map(todo => (
            <TodoItem key={todo.id} todoItem={todo} markComplete={markComplete} />
        ))
    );
};

export default Todos;

TodoItem.js

import React from "react";

const TodoItem = ({todoItem, markComplete}) => {
    const getStyle = () => {
        console.log("style: " + todoItem.completed);
        return {
            background: '#f4f4f4',
            padding: '10px',
            borderBottom: '1px #ccc dotted',
            textDecoration: todoItem.completed ? 'line-through' : 'none'
        }
    };

    return (
        <div style={getStyle()}>
            <p>
                <input type="checkbox" onChange={markComplete.bind(this, todoItem.id)}/>{' '}
                {todoItem.title}
            </p>
        </div>
    );
};

export default TodoItem;

我希望这个getStyle()将遵循状态。。。以某种方式

共有2个答案

子车芷阳
2023-03-14

rray.prototype.map()返回一个新的数组,您正在丢弃它。您需要使用新的数组,例如:

const markComplete = id => {
  ...
  setTodos(totos.map(...))
沃学
2023-03-14

不要改变状态。在函数中,您将直接修改todos数组。像这样改变你的功能以避免突变

const markComplete = id => {
   console.log((new Date()).toString());
   let newTodos = todos.map(todo => {
       let newTodo = { ...todo };
       if (newTodo.id === id) {
           newTodo.completed = !newTodo.completed;
       }
       return newTodo;
    });
    setTodos(newTodos);
};
 类似资料:
  • 问题内容: 我试图了解何时使用React功能组件和类,并从文档中阅读它们并没有真正详细介绍。当您希望类的特定功能构成组件时,能否给我下面的一些主要例子? 功能组件的功能较弱,但更简单,并且仅使用一个render()方法就类似于类组件。除非您需要仅在类中可用的功能,否则我们建议您改用功能组件。 问题答案: 您仅在以下情况下需要组件: 需要组件 状态 或 需要 生命周期方法 。例如等

  • 我创建了一个包含登录组件和注册组件的签名页面组件。我的问题是,我如何传递一个onhtml函数从父到子,以便更改我的父组件(签名页组件)的状态?我期望的是,通过单击子组件中的按钮,可以切换父组件的活动状态,并根据活动状态更改样式。我试图通过一个处理功能从父到子,但它不能很好地工作。 有什么解决办法吗? codesandbox中的详细信息:https://codesandbox.io/s/wizard

  • 问题内容: 在React中,这两种实现之间有什么真正的区别?一些朋友告诉我,FirstComponent是模式,但是我不明白为什么。SecondComponent看起来更简单,因为渲染仅被调用一次。 第一: 第二: 更新:我将setState()更改为this.state = {}(感谢joews),但是,我仍然看不到区别。一个比另一个好吗? 问题答案: 应该注意的是,复制永远不会更改为状态的属性

  • 如何设置父组件的状态从子组件内部的反应?子组件只是一个我想设置组件状态的函数。

  • 我正在使用一个名为React语义ui日期选择器的React模块,我相信它是基于React日期选择器的。不管怎样,这都是一个普通的问题。我的主类组件和日期选择器功能组件位于同一个文件中。日期选择器呈现并工作正常,但我不知道如何在主类组件中访问日期选择器的实际值。 代码的简化版本可以在下面看到,我只是控制台日志记录了几个变量的值。有人能给我一个建议,告诉我从类组件中访问所选日期选择器值的最佳方式吗?

  • 问题内容: 我正在尝试将在这里找到的这个很棒的动画转换为React可重用的组件。看来此组件将需要一个父组件作为画布,而许多子组件则为。 出于性能方面的考虑,将它们变成无状态组件可能会更好,因为会有很多这样的组件。我不熟悉制作无状态组件,并且想知道应该在哪里定义和中定义的和函数。 无状态组件的功能是在组件内部还是外部?换句话说,以下哪个更好? 1: 2: 每种都有什么优点/缺点,其中哪一种对我的特定