处理嵌套 React 组件的状态变化

2023-11-22

所以,我有多个 ReactComponent。最初,我认为会有一个具有自己状态的父组件(让我们称之为 GrandPa),并且它将有关其状态的一些信息传递给另一个组件(称之为 Parent)。同样,Parent 将他的一些传递给 Child,child 传递给 GrandChild。所以我们有层次结构:

爷爷 -> 父母 -> 孩子 -> 孙子

然而,我很快意识到,当我用方法改变 GrandPa 的状态时this.setState(prevState => (<new state based on prevState>)),更改不会沿着通道级联。我意识到的另一个问题是将更改也传递到频道上。我还没有找到一个好的方法来做到这一点。 (之前,我做了一些非常粗略的事情,将一些事件绑定到 DOM 中的组件,并拥有一个可从所有 ReactComponent 访问的公共变量。然后,当任何人触发特定事件时,我会尝试触发事件来更新各自的组件......长话短说,这造成了很多问题并且很丑陋。)

因此,我在下面的示例代码中尝试仅使用父母和孩子来执行此操作。这是一个虚拟示例,但只是为了学习如何做到这一点。这位家长,名叫ReactRandom有一个状态{name: <name>}并且有一个方法可以将该名称更改为随机字符串。什么时候ReactRandom渲染,它从另一个组件渲染该名称ReactRandomNested它基本上打印出通过其自己的道具传递的名称。在这里,我在里面创建了一个方法ReactRandomNested它显式地呈现更改(顺便说一句,我不希望这样做,我认为有一种方法可以将更新级联到通道中,而不必显式地这样做,因为它会很快变得令人讨厌,因为我们有> 2个嵌套级别)。然而,即使这样也行不通。它有 1 步延迟并在当前时间步渲染先前的更新。

无论如何,这是我目前拥有的代码:

class RandomReactNested extends React.Component {
    constructor(props) {
        super(props);
        this.state = {name: props.name};
    }

    handleChange() {
        let self = this;
        self.setState({name: self.props.name});
    }

    render() {
        let self = this;
        return React.createElement("span", {
            onClick: () => self.handleChange.call(this)
        }, self.state.name);
    }
}

class RandomReact extends React.Component {
    constructor (props){
        super(props);
        this.state = {name: props.name};
        this.changeName.bind(this);
    }

    changeName () {
        let random_word_length = Math.round(Math.random()*20),
            index_count = 0,
            new_name = "",
            alphabet = "abcdefghijklmnopqrstuvwxyz";
        for (index_count; index_count <= random_word_length; index_count += 1) {
            new_name += `${alphabet[Math.round(Math.random()*random_word_length)]}`;
        }
        console.log(new_name);

        this.setState(prevState => ({
            name: new_name
        }));
    }

    render() {
        let self = this;
        return React.createElement("div", {
            key: 2,
            onClick: () => (this.changeName.call(self))
        },
            React.createElement(RandomReactNested, {
                name: self.state.name
            }));
    }
}

顺便说一句,我对 React 还很陌生,正在尝试学习如何有效地使用它。我还在 ReactJS 网站的页面末尾看到了这一点(https://reactjs.org/docs/composition-vs-inheritance.html),这似乎建议反对这一点(但我不完全确定?):

“那么继承呢? 在 Facebook,我们在数千个组件中使用 React,但我们还没有发现任何建议创建组件继承层次结构的用例。 道具和组合为您提供了以明确且安全的方式自定义组件的外观和行为所需的所有灵活性。请记住,组件可以接受任意 props,包括原始值、React 元素或函数。 如果您想在组件之间重用非 UI 功能,我们建议将其提取到单独的 JavaScript 模块中。组件可以导入它并使用该函数、对象或类,而不扩展它。”


咳嗽,还原,咳嗽

无论如何,传递道具是一条单行道!你可以把东西传承下来并使用它们,但你不能把它们传承下去。操作父组件的唯一方法是将整个函数作为 props 传递。

updateGrandpaState(newData){
this.setState({ originalData: newData})
}

从你的祖父组件中,你会像这样传递它......

<ParentComponent updateGrandpaState={this.updateGrandpaState} />

在你的父组件中你可以调用

this.props.updateGrandpaState(parentComponentData)

然后,它将触发祖父组件中的原始函数,更新祖父组件状态。

是的,你可以走得更远,预警,你走得越深,事情就会变得越丑陋......

爷爷里面

< ParentComponent updateGrandpaState={this.updateGrandpaState} /> 

内部父级

< ChildComponent updateGrandpaState={this.props.updateGrandpaState} />

内心的孩子

this.props.updateGrandpaState(childComponentData)

当你深入两层时,我在进行开发工作时也会在 componentDidMount 上 console.log(this.props) 。

为了让事情变得更酷,你甚至可以将 grandpaState 传递给 ParentComponent 来使用,你可以将其连接到 componentWillRecieveProps......

<ParentComponent grandpaState={this.state} updateGrandpaState={this.updateGrandpaState} />

但说实话,一旦你学会了 redux,设置它几次,它真的很棒,我永远不会不使用它!

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

处理嵌套 React 组件的状态变化 的相关文章

随机推荐

  • 使用多索引绘制 matplotlib 表

    是否可以使用 matplotlib 绘制具有多索引的表格 就像 pandas 显示表格一样 我在网上找到最多的是这个打开 2012 年的 git 问题 给出以下示例数据框 arrays bar bar baz baz foo foo qux
  • 将 ObservableCollection 项绑定到 WrapPanel 中的 UserControl?

    我可能只是在这里遗漏了一些明显的东西 所以如果这是一个非常愚蠢的问题 我深表歉意 我的视图中有一个 WrapPanel 我需要将其绑定到 ViewModel 上的 ObservableCollection 此 ObservableColle
  • 通过 Javascript 将 DOMTimeStamp 转换为本地化的 HH:MM:SS MM-DD-YY

    The W3C 地理定位 API 除其他外 用途DOM时间戳其修复时间 这是 自 Unix 纪元开始以来的毫秒数 将其转换为人类可读格式并调整本地时区的最简单方法是什么 的一个版本Date构造函数将 自 Unix 纪元开始以来的毫秒数 作为
  • 捕获 HTTP 请求

    有没有办法使用 C 监视和捕获来自计算机的所有传出 HTTP 请求 我需要一种独立于浏览器的方式来记录访问过的 URL 我用小提琴手 http www fiddler2 com
  • Eclipse 中的代码颜色样式

    一个很好的简单问题 是否有类似的东西http studiostyl es 对于日食 Update 因为我使用此链接来了解如何使用该插件 所以我想我应该将其放在这里 http www eclipsecolorthemes org view p
  • 在接口类中声明抽象信号

    当实现类已经从 QObject QWidget 派生时 如何在抽象类 接口中声明 Qt 信号 class IEmitSomething public this should be the signal known to others vir
  • 在 Symfony2 + Twig 中使用变量进行翻译是可能的吗?

    第一个输出未翻译的字符串 chart name short trans charts 这个有效 与chart name short 应该输出 charts region area short trans charts 我错过了什么吗 似乎在
  • 从 Appengine 连接到 Google Containers 的 Kubernetes 服务

    我有一个包含 Appengine 部分和 Google 容器集群的项目 Appengine 应用程序需要对部署到 Google 容器的服务进行 http 调用 我知道我可以为服务分配一个外部 IP 将其硬编码到我的 Appengine 应用
  • 如何从 Play 2 Java 上的路由反向生成绝对 URL?

    我想从 Play 2 Java 中的控制器获取绝对 URL 我找到了Scala 的完全相同的问题 但我无法让它在 Java 中工作 public class MyController extends Controller public st
  • iOS:旋转 uiimageview

    在我的应用程序中 我有一个图像视图 它的名称是箭头 我以这种方式将其旋转 180 度 arrow transform CGAffineTransformMakeRotation M PI 它工作正常 但现在我希望这个图像视图返回到原始位置
  • 使用 jQuery 将 Div 位置设置为鼠标位置

    我试图将我的 Div 放置在用户点击我的图像的任何位置 test是我的 Div 并且myimg是我的形象 这是我的JS
  • 如何从 Javascript 调用原生 Iphone/Android 函数?

    我在 iPhone 和 Android 中都使用 Web 视图 在Android中 我使用创建一个变量调用原生 Android 函数 方法 但我没能在 iPhone 中找到类似的东西 那么 如何从 JavaScript 调用本机 Iphon
  • PLSQL从XML读取值?

    我有一个带有 XML 代码的字符串 我想在 PL SQL 中将它的值提取到变量中 XML 非常简单 与此没有什么不同
  • ReactJS 如何设置默认选中复选框?

    在分配默认值后 我无法更新复选框状态checked checked 在反应中 var rCheck React createElement input type checkbox checked checked value true Che
  • javax.naming.NameNotFoundException:名称 jdbc 未在此上下文中绑定

    我正在从事网络服务 并且是初学者 我尝试在服务文件中获取 Oracle Db 连接 但收到以下错误 javax naming NameNotFoundException Name jdbc is not bound in this Cont
  • 使用 ant 构建 Android 测试时如何使用 emma 过滤器?

    我知道在构建 Android 测试项目时如何在 ant 中使用 emma 但在使用 SDK 时找不到任何有关如何使用过滤器的提示 emma 网站在自己调用 emma 时对此进行了解释 但在 Android SDK 构建文件中 emma 并未
  • 强制浏览器获取asp.net应用程序中最新的js和css文件

    有些浏览器会缓存 js 和 css 文件 除非您强制刷新 否则无法刷新它们 最简单的方法是什么 我刚刚实施了这个似乎有效的解决方案 在页面上声明版本变量 public string version get set 从 web config
  • C++ - 为什么我要在堆上创建这些小部件?

    使用 C 和 Qt 创建 GUI 时 您可以创建一个标签 如下所示 QLabel label new QLabel Hey you centralWidgetParent 这会在堆上创建对象 并将一直保留在那里 直到我手动删除它或父对象被销
  • C++ 类对象内存映射

    当我们创建一个类的对象时 它的内存映射是什么样的 我更感兴趣的是对象如何调用非虚拟成员函数 编译器是否创建一个像 vtable 这样在所有对象之间共享的表 class A public void f0 int int in b1 A a n
  • 处理嵌套 React 组件的状态变化

    所以 我有多个 ReactComponent 最初 我认为会有一个具有自己状态的父组件 让我们称之为 GrandPa 并且它将有关其状态的一些信息传递给另一个组件 称之为 Parent 同样 Parent 将他的一些传递给 Child ch