这个巨高大上的React组件通信工具,不会用

想实现react兄弟组件之间的通信,redux还没开始上手,所以选择了据说是react团队使用的js-signals。
先做了个demo:

const App = () => (
  <div>
    <Header />
    <Main />
  </div>

);

只有两个组件,Header和Main,代码如下:

//Header

import React, { Component } from 'react';
import Signal from 'signals';

class Header extends Component {
  render() {
    //custom object that dispatch a `started` signal
    const myObject = {
      started: new Signal()
    }
    const onStarted = (param1, param2) => {
      alert(param1 + param2);
    }
    myObject.started.add(onStarted); //这里应该是加监听吧?但我不确定应该怎么写
    return (
      <div>
        Header
      </div>
    )
  }
}

export default Header
//Main
import React, { Component } from 'react';
import Signal from 'signals';

class Main extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    console.log('已触发点击')
    myObject.started.dispatch('foo', 'bar'); 
    //上面那句应该是传值到Header组件里并触发started函数
  }
  render() {
    return (
      <div onClick={this.handleClick}>
        点击触发函数
      </div>
    )
  }
}

export default Main

我是看着js-signals的这个最简单的例子弄的

clipboard.png

官方链接

但是点击onClick之后会报错,

clipboard.png

说是myObject未定义,但在Main组件里定义似乎又不太合逻辑……吧?
监听和触发这两句不确定应该写在哪里才对

myObject.started.add(onStarted); //add listener
myObject.started.dispatch('foo', 'bar'); //dispatch signal passing custom parameters
myObject.started.remove(onStarted); //remove a single listener

谁能帮我梳理一下呢?谢谢~

阅读 4.7k
3 个回答

新建一个myObj.js里面写

import Signal from 'signals';
const myObject = {
      started: new Signal()
}
export default myObject

然后你再在Header.jsx和main.jsx里写

import myObject from './myObj.js'

图片描述

  1. 首先说下你提问的方式,既然说是报错就应该把错误信息帖出来,不然别人怎么分析你的问题了?

  2. 回到问题,你这里有语法错误

const myObject = () => {
      started: new Signal()
    }

在箭头函数要直接返回一个对象应该用 () 包起来

const myObject = () => ({
      started: new Signal()
    })

但你要的是一个对象,应该这样就行了:

const myObject = {
      started: new Signal()
    }

为啥 不 rxjs

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进