react 非父子组件通讯(发布订阅模式)

父组件里包含两个子组件,子组件一将值传入子组件二显示;

 

// 非父子组件通讯   发布订阅模式
import React, { Component } from 'react'
import axios from 'axios'
import './css/movie.css'

// 定义bus
var bus = {
  list: [],
  // 订阅
  subscribe(callback) {
    this.list.push(callback)
  },

  // 发布
  publish(text) {
    // 遍历所有的列表将回调函数执行
    this.list.forEach(callback => {
      callback && callback(text)
    })
  }
}

export default class App extends Component {
  constructor() {
    super()
    this.state = {
      cinemaList: [],
    }
  }
  componentDidMount() {
    this.init()
  }
  init() {
    // 请求数据
    axios.get('/text.json').then(res => {
      this.setState({
        cinemaList: res.data.data.films
      })
    })
  }
  render() {
    return (
      <div>
        {
          this.state.cinemaList.map(item =>
            <FilmItem key={item.filmId} {...item}></FilmItem>
          )
        }
        <FilmDetail></FilmDetail>
      </div>
    )
  }
}

// 子组件1
class FilmItem extends Component {
  render() {
    let { poster, name, grade, actors, nation, runtime, synopsis } = this.props
    return <div className='Box' onClick={() => {
      // this.props.onEvent(synopsis)
      // 发布者
      bus.publish(synopsis)
    }}>
      <div className='movieBox'>
        <div className='movieBox_left'>
          <div className='imgBox'>
            <img className='img' src={poster} alt={name}></img>
          </div>
          <div className='rightBox'>
            <div className='list1'>{name}</div>
            <div className='list2'>观众评分: {grade}</div>
            <div className='list3'>主演: {actors[0].name}</div>
            <div className='list4'>{nation} | {runtime}分钟</div>
          </div>
        </div>
        {/* <div className='movieBox_right'>
          111
        </div> */}
      </div>
    </div>
  }
}

// 子组件2
class FilmDetail extends Component {
  constructor() {
    super()
    this.state = {
      info: ''
    }
    // 订阅
    bus.subscribe((info) => {
      console.log('我在右边黄色的组件中定义', info);
      this.setState({
        info: info
      })
    })
  }
  render() {
    return <div className='filmdetail'>
      {this.state.info}
    </div>
  }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值