React 中基于当前状态的 setState

2023-12-21

在 React 中更新有状态组件时,组件使用当前状态来更新新状态被认为是一种不好的做法。

例如,如果我有一个类存储过滤器在其状态中是否打开,那么在性能方面,用于更新状态的这些选项之一是否比另一个更可取?

选项1:

class Container extends Component {
    state = {
        show: false
    }

    show = () => this.setState({ show: true })

    hide = () => this.setState({ show: false })

    render() {
        <ExternalComponent
            show={this.show}
            hide={this.hide}
        />
    }
}

选项2:

class Container extends Component {
    state = {
        show: false
    }

    toggleVisibility = () => this.setState({ show: !this.state.show })

    render() {
        <ExternalComponent
            toggleVisibility={this.toggleVisibility}
        />
    }
}

选项 3:

class Container extends Component {
    state = {
        show: false
    }

    setShow = (newVal) => this.setState({ show: newVal })

    render() {
        <ExternalComponent
            setShow={this.setShow}
        />
    }
}

组件访问自己的状态没有任何问题。只写状态不会很有用!但是,在向其他组件公开组件状态或状态更改方法时应该非常小心。组件状态是内部的,只能通过经过深思熟虑的接口从外部进行访问,以防止组件变得混乱。

事实上,有一个与示例#2 类似的示例在反应文档中 https://facebook.github.io/react/docs/handling-events.html:

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // This binding is necessary to make `this` work in the callback
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(prevState => ({
      isToggleOn: !prevState.isToggleOn
    }));
  }

  render() {
    return (
      <button onClick={this.handleClick}>
        {this.state.isToggleOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);

但是请注意与您的示例的区别。需要在构造函数中绑定toggle方法,以确保this意味着你期望它意味着什么。

如果包装组件是跟踪子组件可见性的组件ExternalComponent,然后我希望包装器渲染某种隐藏/显示可供性,而不是将切换方法传递到子组件中,然后将当前可见性作为道具传递到子组件中或有选择地渲染它(请注意,选择性渲染将导致整个子组件在再次启用时重新安装,这可能会很昂贵;隐藏它可能比拆除它并重新创建它更好)。这使得关注点的划分变得清晰:包装器知道可见性,而子组件不需要知道如何或为何做出该决定,也不需要接触包装器的内部状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 中基于当前状态的 setState 的相关文章

随机推荐

  • python TypeError:“列表”对象不可调用错误

    我是 python 新手 我试图理解这里的一个基本错误 我在下面的代码中收到 TypeError list object is not callable 错误 有人可以解释一下我的代码有什么问题吗 graph a b c b a c c b
  • 通过 AKS 群集中的负载均衡器访问服务

    我配置了一个集群 其中的服务 及其相关的 Pod 容器 全部部署到私有子网中 其中一个 Pod 代表应用程序的 UI 我定义了一个具有公共 IP 的负载均衡器来提供对 UI 的访问 至少这是我的意图 当我在浏览器中输入包含负载均衡器 IP
  • Angular Js+ TypeScript:如何创建动态表

    我是打字稿和角度的新手 我已经使用打字稿和角度js实现了一个模块 在其中我需要创建一个动态表 它将获取演示文稿的类型并相应地附加到我的视图 就像我之前在 C 中所做的那样 我在下面给出了我的 c 代码 private void ShowCu
  • 需要均匀分布的按钮行

    我尝试使用 3 行和 4 列将所有按钮水平均匀地隔开 但失败了 垂直的就好 下面是 3 种不同的按钮间隔尝试 我的 3 行每行 1 种 第一行拉伸图形 这是不需要的 第二行不拉伸但没有间距 图形之间需要间距 而第三行拉伸没有任何间距 请帮我
  • 使用 IoC 进行单元测试

    如何使用 IoC 容器进行单元测试 使用 IoC 管理大型解决方案 50 多个项目 中的模拟是否有用 有什么经验吗 有哪些 C 库适合在单元测试中使用它 一般来说 单元测试不需要 DI 容器 因为单元测试就是分离职责 考虑一个使用构造函数注
  • Mongoose 在启动时调用 EnsureIndex,但不建议这样做。那么为什么它是默认的呢?

    我无法理解一件事 当我们读到猫鼬文档 http mongoosejs com docs guide html 当您的应用程序启动时 Mongoose 会自动调用ensureIndex对于架构中每个定义的索引 虽然有利于开发 但建议在生产中禁
  • 获取 Windows 中本地计算机用户名列表

    如何使用 C 获取 Windows 中本地计算机用户名列表 using System Management SelectQuery query new SelectQuery Win32 UserAccount ManagementObje
  • ggplot2直方图中每个方面的不同断点

    一个 ggplot2 挑战的 latticist 需要帮助 在直方图中请求变量每面中断的语法是什么 library ggplot2 d data frame x c rnorm 100 10 0 1 rnorm 100 20 0 1 par
  • 基本教师登录的用例图

    我正在创建一个非常基本的用例图来显示教师登录 该登录包括一个忘记密码 如果用户忘记密码 和一个重置密码 如果他们希望在登录后重置密码 我的问题是以下用例图表创建 尤其是包含和扩展 这确实是非常基本的 通常 登录宁愿成为其他用例的先决条件 而
  • 通过 C# 和 SMO 检查并删除现有表

    我正在尝试按名称查找 SQL 表 如果存在则删除它 这一切都需要使用 SMO 在 C 中完成 更复杂的是 该表还有一个 dbo 以外的模式 最终该表将通过 SMO 创建 我可以正常工作 但我必须确保它不存在 然后才能重新创建它 我看到的所有
  • 如何尽可能高效地将存储在 RDD 列中的多个 json 表“缩减”为单个 RDD 表

    使用以下代码在数据帧中使用联合来并发访问附加行是否可以正常工作 目前显示类型错误 from pyspark sql types import schema StructType StructField owreg StringType Tr
  • Laravel 'like' 查询与 MongoDB 连接

    我在 laravel like 查询中遇到问题 我在 laravel 上有一个 MIS 数据库在 MongoDb 上 现在我的数据库有一个名为kw带有 urlencoded 关键字 例如cars 20in 20London 现在我的查询给出
  • pandas 处理 numpy timedelta64[ms]

    gt gt gt import pandas as pd gt gt gt pd version 0 11 0 gt gt gt import numpy as np gt gt gt np version 1 7 1 gt gt gt d
  • 如何从Scala中的资源文件夹中读取文件?

    我有一个如下所示的文件夹结构 main java resources scalaresources commandFiles 在该文件夹中我有我必须阅读的文件 这是代码 def readData runtype String snmphos
  • 如何在 R 的 For 循环中正确使用 group_by() 和 summarise()

    我正在尝试计算一些摘要信息 以帮助我检查数据集中不同组中的异常值 我可以使用我想要的输出类型dplyr group by and dplyr summarise 包含给定变量的每个组的摘要信息的数据框 像这样的事情 Sepal Length
  • For 循环 gitlab-ci.yml

    我有这个代码片段 它给了我语法错误 意外的文件结尾 如果我将其复制到 sh 文件中并在终端中运行 它就可以工作 before script sbt sbtVersion for file in pending sql do file bas
  • 在快速枚举期间将对象设置为零[重复]

    这个问题在这里已经有答案了 我想在枚举数组时将对象设置为 nil 如下所示 for Object object in array object nil 然后 Xcode 告诉我 默认情况下 无法在 ARC 中修改快速枚举变量 声明变量 st
  • 多对多关系桥表困境

    salesman uId salesGroupLinked uId groupId add performacesScore field here group groupId 我上面有 3 个表 形成了多对多关系 我会添加一个字段 perf
  • 如果@EnvironmentObject如何创建通用?

    我最近遇到需要编写一个 MockClass 因为它会导致 SwiftUIpreview从工作中 不幸的是 我收到错误 Property type T does not match that of the wrappedValue prope
  • React 中基于当前状态的 setState

    在 React 中更新有状态组件时 组件使用当前状态来更新新状态被认为是一种不好的做法 例如 如果我有一个类存储过滤器在其状态中是否打开 那么在性能方面 用于更新状态的这些选项之一是否比另一个更可取 选项1 class Container