发布订阅主要用来解决复杂的层集之间的数据交互,比如兄弟之间的复杂传值,这种情况就不适合使用props和context来进行传值。
1.在使用发布订阅前需要安装pubsub-js包
npm install pubsub-js
2.发布者主要代码
import React, { Component } from 'react'
// 导入发布订阅包
import PubSub from 'pubsub-js'
import './SelectData.css'
export default class SelectData extends Component {
unpage=React.createRef()
selePage=()=>{
// 接收用户输入数据
let page=this.unpage.current.value
// 调用pubsub提供的方法publish(发布者利用接收到的数据传给订阅者page)(pageNumber为发布的函数名,相当于标识身份用的)
PubSub.publish('pageNumber',page)
// 提交后全选
this.unpage.current.select()
}
render() {
return (
<div className='select'>
<input type='text' ref={this.unpage} />
<button onClick={this.selePage}>提交</button>
</div>
)
}
}
3.订阅者部分代码
import React, { Component } from 'react'
import './GoodList.css'
//导入发布订阅包
import PubSub from 'pubsub-js'
// 导入axios请求包
import axios from 'axios'
export default class GoodList extends Component {
state = {
// 初始值
page: 1,
goods: []
}
// 初始化加载
componentDidMount() {
// 初始化调用
this.getData()
// 订阅者接收发布者提供的数据data(pageNumber为发布的函数名,相当于标识身份用的)
PubSub.subscribe('pageNumber', (msg, data) => {
console.log(msg, data);
// 使用setState修改
this.setState({
page: data
}, () => {
// 延时调用
this.getData()
})
})
}
// axios请求封装
getData = () => {
axios.get(`https://api.shop.eduwork.cn/api/index?page=${this.state.page}`)
.then(res => {
console.log(res);
if (res.status === 200) {
// 修改goods值
this.setState({
goods: res.data.goods.data
})
}
})
}
render() {
// 解构
let { goods } = this.state
console.log(goods);
return (
<div className='goods'>
<ul>
{/* 遍历取值 */}
{goods.map(ele =>
<li key={ele.id}>
<img src={ele.cover_url} alt="" />
<p>{ele.title}</p>
<p className='bookText'>
<span>¥{ele.price}</span><span>⭐{ele.stock}</span>
</p>
</li>
)}
</ul>
</div>
)
}
}