IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React-消息订阅与发布(pubsub-js)兄弟组件传值 -> 正文阅读

[JavaScript知识库]React-消息订阅与发布(pubsub-js)兄弟组件传值

基本功能
在搜索框中输入搜索,然后不通过父子传值的方式改为兄弟组件之间传值实现搜索结果的展示。点击搜索后,得到结果之后通知List组件进行界面数据更新
关键代码

1、安装pubsub-js

npm add pubsub-js

2、App.js

import React, { Component } from 'react';
import Search from './components/Search';
import List from './components/List';
class App extends Component {
    
    render() {
        return (
            <div className="container">
                <Search />      
                <List/>
            </div>
        );
    }
}

export default App;

3、List=>index.js 在componentDidMount中订阅notice通知,记得在页面销毁的时候取消订阅

import React, { Component } from 'react';
import PubSub from 'pubsub-js'
import './index.css'

class List extends Component {
    state={//初始化状态
        users:[], //users初始值为数组
        isFirst:true,//是否为第一次打开页面
        isLoading:false,//是否处于加载中
        err:''//存储请求相关的错误信息
    }
    componentDidMount(){
        this.token=PubSub.subscribe('notice',(_,stateObj)=>{
            this.setState(stateObj)
        })
    }
    componentWillUnmount(){
        PubSub.unsubscribe();
    }
    render() {
        const {users,isFirst,isLoading,err}=this.state
        return (
            <div className="row">
                {
                    isFirst?<h2>欢迎使用,输入关键字,随后点击搜索</h2>:
                    isLoading?<h2>loading....</h2>:err?<h2 style={{color:'red'}}>{err}</h2>:
                    users.map(userObj=>{
                        return(
                            <div className="card" key={userObj.id}>
                                <a href={userObj.html_url} target="_blank" rel="noreferrer" >
                                <img src={userObj.avatar_url} style={{width:'100px'}} alt='head_portrait'/>
                                </a>
                                <p className="card-text">{userObj.login}</p>
                           </div>
                        )
                    })
                }               
             </div>
        );
    }
}

export default List;

4、Search=>index.js 在搜索后需要通知到List组件进行更新

import React, { Component } from 'react';
import PubSub from 'pubsub-js'
import axios from 'axios';
class Search extends Component {

    search=()=>{
        //获取用户的输入(连续解构赋值+重命名)
       const{keyWordElement:{value:keyWord}}=this;
       console.log(keyWord)
        //发送网络请求前通知List更新状态
        PubSub.publish('notice',{isFirst:false,isLoading:true})
        //发送网络请求
        axios.get(`/api1/search/users?q=${keyWord}`).then(response=>{
         PubSub.publish('notice',{isLoading:false,users:response.data.items})
        },error=>{
            //请求失败后通知app更新状态
            PubSub.publish('notice',{isLoading:false,err:error.message})
        })
    }
    render() {
        return (
                <section className="jumbotron">
                    <h3 className="jumbotron-heading">搜索github用户</h3>
                    <div>
                        <input ref={c=>this.keyWordElement=c} type="text" placeholder="输入关键词点击搜索"/>&nbsp;<button onClick={this.search}>搜索</button>
                    </div>
                </section>
        );
    }
}

export default Search;

5、List=>index.css

.album {
    min-height: 50rem; /* Can be removed; just added for demo purposes */
    padding-top: 3rem;
    padding-bottom: 3rem;
    background-color: #f7f7f7;
  }
  
  .card {
    float: left;
    width: 33.333%;
    padding: .75rem;
    margin-bottom: 2rem;
    border: 1px solid #efefef;
    text-align: center;
  }
  
  .card > img {
    margin-bottom: .75rem;
    border-radius: 100px;
  }
  
  .card-text {
    font-size: 85%;
  }
  

代理setProxy.js

const proxy=require('http-proxy-middleware')
module.exports=function(app){
    app.use(
        proxy('/api1',{//遇见/api1前缀的请求,就会触发该代理配置
            target:'http://localhost:5000',//请求转发给谁
            changeOrigin:true,//控制服务器收到的请求头中的Host字段的值
            pathRewrite:{'^/api1':''}//重写请求路径
        })
    )
}
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:37:04  更:2021-12-01 17:39:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:48:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码