React - 从同级组件调用函数

2023-12-01

假设我有一个组件树,如下所示

<App>
  </Header>
  <Content>
      <SelectableGroup>
          ...items
      </SelectableGroup>
  </Content>
  <Footer />
</App>

Where SelectableGroup能够通过鼠标选择/取消选择其包含的项目。我将当前选择(选定项目的数组)存储在 redux 存储中,以便我的应用程序中的所有组件都可以读取它。

The Content组件设置了一个ref to the SelectableGroup这使我能够以编程方式清除选择(调用clearSelection())。像这样的东西:

class Content extends React.Component {

    constructor(props) {
        super(props);
        this.selectableGroupRef = React.createRef();
    }

    clearSelection() {
        this.selectableGroupRef.current.clearSelection();
    }

    render() {
        return (
            <SelectableGroup ref={this.selectableGroupRef}>
                {items}
            </SelectableGroup>
        );
    }

    ...

}

function mapStateToProps(state) {
    ...
}

function mapDispatchToProps(dispatch) {
    ...
}

export default connect(mapStateToProps, mapDispatchToProps)(Content);

我可以很容易地想象通过这个clearSelection()向下Content的孩子们。但这是我的问题,我怎样才能打电话给clearSelection()来自同级组件Footer?

  • 我应该从Footer并向 Redux 存储设置某种“请求调用清除选择”状态?对此做出反应componentDidUpdate()回调中Content然后立即调度另一个操作来重置此“请求调用清除选择”状态?
  • 或者有没有更好的方法来调用兄弟姐妹的函数?

您可以使用 ref 来访问 Content 组件的全部功能,如下所示

const { Component } = React;
const { render } = ReactDOM;

class App extends Component {
  render() {
    return (
      <div>
        <Content ref={instance => { this.content = instance; }} />
        <Footer clear={() => this.content.clearSelection() } />
    
      </div>
    );
  }
}

class Content extends Component {
  clearSelection = () => {
    alert('cleared!');
  }

  render() {
    return (
      <h1>Content</h1>
    );
  }
}

class Footer extends Component {

  render() {
    return (
      <div>Footer <button onClick={() => this.props.clear()}>Clear</button>
      </div>
    );
  }
}

render(
  <App />,
  document.getElementById('app')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="app"></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React - 从同级组件调用函数 的相关文章

随机推荐

  • 在R中如何将经度和纬度转换为可在ggplot2或ggmap中使用的格式[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我得到了原始经度 纬度数据 其格式无法由 R 地图处理 所以我想知道是否有一些 R 函数或算法可以帮助我将这些原始数据转换为可读格式 也许是UTM 这是我的原始数据 纬度 32 14
  • 如何正确处理来自 ListenableFuture 番石榴的异常?

    我有一个库 其中为我们的客户提供了两种方法 同步和异步 他们可以调用他们认为适合其目的的任何方法 执行 Synchronous 等待直到得到结果 然后返回结果 execute Asynchronous 立即返回一个 Future 如果需要
  • 如何使用 Kafka 流 DSL 函数处理重复消息

    我的要求是跳过或避免使用 kafka 流 DSL API 从 INPUT 主题接收到的重复消息 具有相同的密钥 如果发生任何故障 源系统可能会向 INPUT 主题发送重复的消息 FLOW 源系统 gt 输入主题 gt Kafka Strea
  • Misra-C 2012 规则 10.1 布尔操作数在表达式为布尔类型的情况下使用

    以下几行会产生 Misra 违规 unsigned int u16 a unsigned char u8 b if u16 a u8 b Generates Misra C 10 1 violation u16 a 2 1 Generate
  • tidyr::收集不同类型的多个列

    我的问题类似于这个问题 我试图tidyr gather多列 但是 链接中提供的解决方案不太理想 因为所有列的属性通常不相同 因此它们被删除 请注意 我知道如何使用基本 R 执行此操作 但我正在尝试学习如何使用 tidyr 和 或 dplyr
  • 如何操作data.table中的data.frame

    我有data table其中某些观察列包含data frame 例如 data table colA c A1 A2 A3 colB list data frame data frame colsubB1 c B2a B2b colsubB
  • 使用 char 指针输入与 char 数组输入

    考虑代码 include
  • npmpublish 的包名称与现有包太相似

    我想将我的包发布到 npm 我得到的错误是 包名称与现有包太相似 403 Forbidden PUT https registry npmjs org mypack Package name too similar to existing
  • ajax请求中的angularjs错误处理

    我想在我的应用程序中编写一个错误处理部分 我使用下面的代码 但是当错误 500 发生时 它可以正常工作 但是存在一个小或可能大的问题 这就是页面加载的第一次和几秒后的错误页面加载 如何才能我删除这几秒钟并直接进入错误页面而不加载释放错误的主
  • 如何使用多短语查询?

    http lucene apache org java 2 3 1 api core org apache lucene search MultiPhraseQuery html 对于 Microsoft app 这个例子 他说使用Inde
  • CSS 选择器中允许使用括号吗?

    在下面的示例中 我想创建一个仅适用于带有文本 Blockhead 的标题的 CSS 规则 div class gumby span class pokey span h3 Blockhead h3 h3 Clay rules h3 div
  • 如何获取嵌套fragment中的Activity?

    我试图在 ViewPager 中包含的片段中调用 getActivity 的活动 并且该 ViewPager 包含在 Fragment 中 我需要在这些片段中调用此活动的一些方法 但 getActivity 始终为此片段返回 NULL 我不
  • 实例字段的初始化与局部变量的初始化

    我一直想知道为什么在下面的例子中可以not初始化实例字段 依赖于它将具有默认值 并访问它 而局部变量显然must被初始化 即使我将其初始化为默认值 它无论如何都会得到 public class TestClass private bool
  • (!object) 和 (object == nil) 之间有区别吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C if obj 和 if obj null 哪个更好 这两个条件有区别吗 if object do something 和 if object nil do something
  • 在 MySQL 中的 accountID 之间转移“钱”

    我有一个问题 我尝试用谷歌搜索但尚未找到答案 我想做的是使用存储过程在 MySQL 中的两个帐户之间转账 例如 如果我使用呼叫转接 20 Test 3 5 然后我将从 accountID 3 转 20 美元到 accountID 5 并写入
  • 返回先前位置时如何避免 TDbgrid 滚动

    在下面的代码中 我们对某些选定的行进行一些操作 不是删除 然而 有时 完成后 顶部选定的行会滚动 使其显示在网格下方 1 2 处 有没有办法避免这种滚动 如果我的遍历下面选定行的代码由于某些不相关的原因不正确 我欢迎更正 Function
  • 里面有数字的叶子标记

    我想使用 Folium 在地图上做一些标记 并在标记内添加一些数字 我希望标记看起来像 Google 地图使用的标准倒置水滴形状 我看到对于 folium Marker 您可以使用参数 icon folium DivIcon html co
  • Codeigniter 查询生成器在 where_in 中使用 implode 函数

    这是我使用 implode 函数的正常 sql 查询 SELECT from search result WHERE skills IN implode s id 现在我想将其转换为 codeigniter 形式 我尝试了以下代码 但失败了
  • Unicode 组合字符的实际最大数量是多少?

    我正在寻找在非组合字符之后出现的 unicode 组合字符的最大数量在现实的自然文本中 我知道在 unicode 文本中 文本中的任何位置都可以放置任意数量的组合 但是 我正在编写一个专门的应用程序 该应用程序必须在资源有限的情况下运行 并
  • React - 从同级组件调用函数

    假设我有一个组件树 如下所示