React---消息订阅发布机制

一、PubSubJS的使用

  1. 工具库: PubSubJS
  2. 下载: npm install pubsub-js --save
  3. 使用:

1) import PubSub from 'pubsub-js' //引入

2) PubSub.subscribe('delete', function(data){ }); //订阅

3) PubSub.publish('delete', data) //发布消息

二、案例

接上一篇github搜索案例改造

1. App.jsx

 1 import React, { Component } from 'react'
 2 import Search from './components/Search'
 3 import List from './components/List'
 4 
 5 export default class App extends Component {
 6     render() {
 7         return (
 8             <div className="container">
 9                 <Search/>
10                 <List/>
11             </div>
12         )
13     }
14 }

 

2. Search.jsx

 1 import React, { Component } from 'react'
 2 import PubSub from 'pubsub-js'
 3 import axios from 'axios'
 4 
 5 export default class Search extends Component {
 6 
 7     search = ()=>{
 8         //获取用户的输入(连续解构赋值+重命名)
 9         const {keyWordElement:{value:keyWord}} = this
10         //发送请求前通知List更新状态
11         PubSub.publish('msg',{isFirst:false,isLoading:true})
12         //发送网络请求
13         axios.get(`/api1/search/users?q=${keyWord}`).then(
14             response => {
15                 //请求成功后通知List更新状态
16                 PubSub.publish('msg',{isLoading:false,users:response.data.items})
17             },
18             error => {
19                 //请求失败后通知App更新状态
20                 PubSub.publish('msg',{isLoading:false,err:error.message})
21             }
22         )
23     }
24 
25     render() {
26         return (
27             <section className="jumbotron">
28                 <h3 className="jumbotron-heading">搜索github用户</h3>
29                 <div>
30                     <input ref={c => this.keyWordElement = c} type="text" placeholder="输入关键词点击搜索"/>&nbsp;
31                     <button onClick={this.search}>搜索</button>
32                 </div>
33             </section>
34         )
35     }
36 }

3. List.jsx

 1 import React, { Component } from 'react'
 2 import PubSub from 'pubsub-js'
 3 import './index.css'
 4 
 5 export default class List extends Component {
 6 
 7     state = { //初始化状态
 8         users:[], //users初始值为数组
 9         isFirst:true, //是否为第一次打开页面
10         isLoading:false,//标识是否处于加载中
11         err:'',//存储请求相关的错误信息
12     } 
13 
14     componentDidMount(){
15         this.token = PubSub.subscribe('msg',(_,stateObj)=>{
16             this.setState(stateObj)
17         })
18     }
19 
20     componentWillUnmount(){
21         PubSub.unsubscribe(this.token)
22     }
23 
24     render() {
25         const {users,isFirst,isLoading,err} = this.state
26         return (
27             <div className="row">
28                 {
29                     isFirst ? <h2>欢迎使用,输入关键字,随后点击搜索</h2> :
30                     isLoading ? <h2>Loading......</h2> :
31                     err ? <h2 style={{color:'red'}}>{err}</h2> :
32                     users.map((userObj)=>{
33                         return (
34                             <div key={userObj.id} className="card">
35                                 <a rel="noreferrer" href={userObj.html_url} target="_blank">
36                                     <img alt="head_portrait" src={userObj.avatar_url} style={{width:'100px'}}/>
37                                 </a>
38                                 <p className="card-text">{userObj.login}</p>
39                             </div>
40                         )
41                     })
42                 }
43             </div>
44         )
45     }
46 }

 

三、扩展Fetch

1. 文档

  1. https://github.github.io/fetch/
  2. https://segmentfault.com/a/1190000003810652

2. 特点

  1. fetch: 原生函数,不再使用XmlHttpRequest对象提交ajax请求
  2. 老版本浏览器可能不支持

3. 相关API

1) GET请求

1 fetch(url).then(function(response) {
2     return response.json()
3   }).then(function(data) {
4     console.log(data)
5   }).catch(function(e) {
6     console.log(e)
7   });

1) POST请求

1 fetch(url, {
2     method: "POST",
3     body: JSON.stringify(data),
4   }).then(function(data) {
5     console.log(data)
6   }).catch(function(e) {
7     console.log(e)
8   })

 

posted @ 2021-04-23 21:20  半指温柔乐  阅读(212)  评论(0编辑  收藏  举报