当前位置: 首页 > 面试题库 >

ReactJS两个组件进行通信

戴原
2023-03-14
问题内容

我刚开始使用ReactJS,但对我遇到的问题有些困惑。

我的应用程序本质上是一个带有过滤器的列表和一个用于更改布局的按钮。目前我使用的三个组成部分:<list />< Filters /><TopBar />,现在很明显,当我更改设置,在< Filters />我想引起一些方法<list />来更新我的看法。

如何使这三个组件相互交互,或者我需要可以对其进行更改的某种全局数据模型?


问题答案:

最佳方法取决于您计划如何安排这些组件。现在想到的一些示例场景:

  1. <Filters /> 是的子组件 <List />
  2. 这两个<Filters /><List />是一个父组件的孩子
  3. <Filters /><List />完全存在于单独的根组件中。

可能还有其他我没有想到的情况。如果您的不适合这些,请告诉我。以下是一些我如何处理前两种情况的非常粗糙的示例:

场景1

您可以将处理程序从传递<List /><Filters />,然后可以在onChange事件上调用该处理函数以使用当前值过滤列表。

#1的JSFiddle→

/** @jsx React.DOM */

var Filters = React.createClass({
  handleFilterChange: function() {
    var value = this.refs.filterInput.getDOMNode().value;
    this.props.updateFilter(value);
  },
  render: function() {
    return <input type="text" ref="filterInput" onChange={this.handleFilterChange} placeholder="Filter" />;
  }
});

var List = React.createClass({
  getInitialState: function() {
    return {
      listItems: ['Chicago', 'New York', 'Tokyo', 'London', 'San Francisco', 'Amsterdam', 'Hong Kong'],
      nameFilter: ''
    };
  },
  handleFilterUpdate: function(filterValue) {
    this.setState({
      nameFilter: filterValue
    });
  },
  render: function() {
    var displayedItems = this.state.listItems.filter(function(item) {
      var match = item.toLowerCase().indexOf(this.state.nameFilter.toLowerCase());
      return (match !== -1);
    }.bind(this));

    var content;
    if (displayedItems.length > 0) {
      var items = displayedItems.map(function(item) {
        return <li>{item}</li>;
      });
      content = <ul>{items}</ul>
    } else {
      content = <p>No items matching this filter</p>;
    }

    return (
      <div>
        <Filters updateFilter={this.handleFilterUpdate} />
        <h4>Results</h4>
        {content}
      </div>
    );
  }
});

React.renderComponent(<List />, document.body);

场景2

与方案1类似,但父组件将是将处理程序函数传递给的组件<Filters />,并将过滤后的列表传递给<List />。我更喜欢这种方法,因为它使<List />脱离了<Filters />

#2的JSFiddle→

/** @jsx React.DOM */

var Filters = React.createClass({
  handleFilterChange: function() {
    var value = this.refs.filterInput.getDOMNode().value;
    this.props.updateFilter(value);
  },
  render: function() {
    return <input type="text" ref="filterInput" onChange={this.handleFilterChange} placeholder="Filter" />;
  }
});

var List = React.createClass({
  render: function() {
    var content;
    if (this.props.items.length > 0) {
      var items = this.props.items.map(function(item) {
        return <li>{item}</li>;
      });
      content = <ul>{items}</ul>
    } else {
      content = <p>No items matching this filter</p>;
    }
    return (
      <div className="results">
        <h4>Results</h4>
        {content}
      </div>
    );
  }
});

var ListContainer = React.createClass({
  getInitialState: function() {
    return {
      listItems: ['Chicago', 'New York', 'Tokyo', 'London', 'San Francisco', 'Amsterdam', 'Hong Kong'],
      nameFilter: ''
    };
  },
  handleFilterUpdate: function(filterValue) {
    this.setState({
      nameFilter: filterValue
    });
  },
  render: function() {
    var displayedItems = this.state.listItems.filter(function(item) {
      var match = item.toLowerCase().indexOf(this.state.nameFilter.toLowerCase());
      return (match !== -1);
    }.bind(this));

    return (
      <div>
        <Filters updateFilter={this.handleFilterUpdate} />
        <List items={displayedItems} />
      </div>
    );
  }
});

React.renderComponent(<ListContainer />, document.body);

场景3

当组件无法在任何类型的父子关系之间进行通信时,文档建议设置全局事件系统。



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

  • 非常简单的例子:我的App.js文件读取 我的Test.js文件上写着 在控制台中,渲染总是打印两次。为什么啊?

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

  • 请帮帮我。我试图在谷歌找到答案,但无法正确获得。

  • 新手一个,最近在学习nextjs14,基于App Router做一个小的笔记本demo. 大致想要的效果如下: 简介: 这里面有两个组件,一个是SideBarNoteList,控制笔记列表,一个是Editor,书写内容,提交内容。Editor的父组件是动态路的page.tsx。笔记的数据源只是一个静态json数据,想简单的模拟一下。结构大致如此: 我的需求也很简单,就是在提交笔记表单后,actio

  • 问题内容: 问题是: 假设我们有两个正在运行的Node.js进程:和。 结果中有返回的函数。 是否有一种从内部调用并获得结果的方法? 从我对Node.js的了解中,我仅找到一种使用套接字进行通信的解决方案。但是,这不是理想的,因为它将需要一个进程在端口上侦听。如果可能,我希望避免这种情况。 编辑: 经过一些问题,我很想补充一点,在层次结构中不能是的子进程,而恰恰相反。同样,如果有帮助,则只能有一个