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

组件通信-React JS

孟沛
2023-03-14

如何从类外或从道具更改状态。SomeFunction()?我结合使用打字脚本。是的,我已经上课了:

类别:

import * as React from "react";
import { Label } from "../../components/label/label";
import { TextBox } from "../../components/textBox/textBox";
import IApp from "../../interfaces/global-interfaces";
import { myStyle } from "./style";

interface HeaderI {
    background: string;
    myFunc(): void;
    // elements: any[];
    // add(id: number, content: any, event: any): void;
}

interface HeaderStateI extends IApp.ElementI {
    background: string;
    elements: any[];
}

export class Header extends React.Component< HeaderI, HeaderStateI , any > {

    public myRef: React.RefObject<Label>;

    constructor(args: any) {
        super(args);
        this.state = { enabledComponent : true,
                       visibility: true,
                       debugView: false,
                       background: args.background,
                       elements: [],
                    };

        this.myRef = React.createRef();
        this.add = this.add.bind(this);

        console.log("state elements:" , this.state.elements);
    }

    public test() {
       alert("Y click on header element");
    }

    public printMe() {
      console.log("Layout Header is active :");
    }

    //  setText = (e: React.ChangeEvent) => {

      // this.setState ( { enabledComponent : true , background :  (e.target as HTMLInputElement).value } );

    // }

    public render() {

        if ( this.state.debugView === false ) {

            return (
                <div style={myStyle} onClick={this.addN} >
                <Label name="headerName" text="i am header paragraph!" />
                {this.state.elements.map((i: any) => {
                  return <span key={i} >{i}</span>;
                })}
                </div>
              );

        } else {

            this.printMe();

            return (
                <div style={myStyle} >
                <Label ref={this.myRef} name="headerName" text="i am header paragraph!"/>
                {this.state.elements.map((i: any) => {
                   return <li key={i} >{i}</li>;
                })}
                </div>
              );

        }

    }

    public componentDidUpdate(prevProps: any) {

        // Typical usage (don't forget to compare props):
        console.warn("prevProps name is: " + prevProps.name);
        if (this.props.background !== prevProps.background) {
          this.printMe();
        } else {
            console.log("Background is same no update.");
        }

    }

    public add = (id: number, content: any, event: any ) => {

        this.setState(
          {
            elements: [React.createElement("div", { key: 2 , onclick : null }, "tyest 12")],
            visibility : false,
          },
        );

        // tslint:disable-next-line:no-unused-expression
        console.log(" add from class in state elements,  visible is " , this.state.visibility );

    }

    public addN(event: MouseEvent | Event) {

        this.setState(
            {
              elements: [React.createElement("div", { key: 2 , onclick : null }, "tyest 12")],
              visibility : false,
            },
          );
        // tslint:disable-next-line:no-unused-expression
        console.log(" add from class in state elements,  visible is NNNN " , this.state.visibility );
    }

}

主文件:

const AddNewElement = Services.addNewElement;
const collectMe = <Header background="#127654"/>;

ReactDOM.render(
    <>
    {collectMe}
    <h3>Page title - inline text only example </h3>
     <Title name="title" text="Hello react title" />
     <Label name="root" text="I am text label component!"/> <br/>
     <TextBox name="root" text="I am textBox component!"/>
    </>,
    document.getElementById("root"),
);

//这个空间已经下课了,为什么我不能改变它???

collectMe.props.background = "#121212";
console.log(collectMe.props);
  • 有很多反应js的问题。在这篇文章中有一些方法,但仍然不适合我:https://www.javascriptstuff.com/component-communication/#2-instance-methods

但是例子太单纯了,没有参数传递等等。。。这仅仅是一个商业上夸大其词的项目。

共有1个答案

訾俊名
2023-03-14

道具是只读的。

无论您是将组件声明为函数还是类,它都不能修改自己的道具。

这里需要做的是使用状态。要使用状态,您需要有基于类的组件。然后,您可以使用回调函数从子组件更新父组件状态。

看看这篇文章,从子组件更新父状态。

 类似资料:
  • 父子组件间通信 这种情况下很简单,就是通过 props 属性传递,在父组件给子组件设置 props,然后子组件就可以通过 props 访问到父组件的数据/方法,这样就搭建起了父子组件间通信的桥梁。 import React, { Component } from 'react'; import { render } from 'react-dom'; class GroceryList exte

  • 我刚开始使用ReactJS,有点被我遇到的一个问题卡住了。 我的应用程序本质上是一个带有过滤器和更改布局的按钮的列表。目前我正在使用三个组件:、和,显然,当我更改中的设置时,我希望触发中的某个方法来更新我的视图。 我如何使这3个组件相互交互,或者我需要某种全局数据模型,在那里我可以只对它进行更改?

  • 1. 前言 本小节我们将介绍组件间是如何实现数据通信的。包括父组件向子组件、子组件向父组件、兄弟组件、非关系组件之间的数据通信。组件通信是组件式开发中非常重要的一部分,也是组件式开发中的难点。在学完本小节之后,同学们可以通过反复地编写组件来加深印象。 2. 慕课解释 组件是 vue 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。我们需要使用特定的方式来

  • 问题内容: 我刚开始使用ReactJS,但对我遇到的问题有些困惑。 我的应用程序本质上是一个带有过滤器的列表和一个用于更改布局的按钮。目前我使用的三个组成部分:,和,现在很明显,当我更改设置,在我想引起一些方法来更新我的看法。 如何使这三个组件相互交互,或者我需要可以对其进行更改的某种全局数据模型? 问题答案: 最佳方法取决于您计划如何安排这些组件。现在想到的一些示例场景: 是的子组件 这两个和是

  • 我遇到了一个有趣的场景,我需要让Child1调用Child2的方法。 我试图创建一个Child2的实例,并将其方法作为道具传递给Child1。我不确定这是否是正确的做法。

  • 本文向大家介绍详解Angualr 组件间通信,包括了详解Angualr 组件间通信的使用技巧和注意事项,需要的朋友参考一下 Angualr 组件间通信 约定: 遵循Angular官方的说法,下文中的AngularJS代指1.x版本,Angular代指Angular2及以后的升级版本。 采用Angular(或者任意MV*)的前端框架开发单页应用(SPA)时,我们都可能会遇见如下的场景: A组件和B组