react案例之使用消息订阅与发布实现github搜索案例

目录

前言

一、准备工作

二、拆分组件

1.配置代理

 2.App父组件

3.Search子组件

4.List子组件

总结

请求数据

 Search组件与List组件之间通信


前言

React兄弟组件之间依靠父组件通信,需要在父组件提前准备好一个函数,并且所有的state状态都要写到父组件里面,想要更新状态,就得利用该函数和props一层一层的传递。而使用PubSubJs消息订阅与发布,就可以实现React兄弟组件之间直接通信。另外本案例还涉及到了同源策略导致的跨域问题,我们会用配置代理的方式实现跨域请求。


一、准备工作

开始案例之前我们需要先准备好一个5000端口的服务器,接口为https://api.github.com/users

const express = require("express");
const axios = require("axios");
const app = express();

app.get("/search/users", function (req, res) {
  const { q } = req.query;
  axios({
    url: "https://api.github.com/users",
    params: { q },
  }).then((response) => {
    res.json(response.data);
  });
});


app.listen(5000, "localhost", (err) => {
  if (!err) {
    console.log("服务器启动成功");
    console.log("请求github真实数据请访问:http://localhost:5000/search/users");
  } else console.log(err);
});

安装PubSubJs到VScode

npm install pubsub-js --save

引入PubSubJs到需要消息订阅的组件中

import PubSub from 'pubsub-js'

二、拆分组件

1.配置代理

// 引入代理
const proxy = require("http-proxy-middleware");

module.exports = function (app) {
  app.use(
    proxy.createProxyMiddleware("/api1", {
      //api1是需要转发的请求(所有带有 /api1 前缀的请求都会转发给5000)
      target: "http://localhost:5000", // 配置请求转发的目标地址(能返回数据的服务器地址)
      changeOrigin: true, //控制服务器接收到的请求头中host字段的值
      /*
                changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000
                changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:3000
                changeOrigin默认值为false,但我们一般将changeOrigin值设为true
            */
      pathRewrite: { "^/api1": "" }, // 去除请求前缀,保证交给服务器的是正常请求的地址(必须配置)
    }),

 2.App父组件

// 引入react核心库
import React, { Component } from 'react'
// 引入子组件
import Search from './components/Search'
import List from './components/List'

export default class App extends Component {

    render() {

        return (
            <div className="container">
                <Search />
                <List />
            </div>
        )
    }
}

3.Search子组件

import React, { Component } from 'react'
import PubSub from 'pubsub-js'
import axios from 'axios'


export default class Search extends Component {


  //点击搜索回调
  updateUserData = () => {

    // 获取输入的值,(连续解构+重命名)的方式
    const { getKeycode: { value: keyWord } } = this
    console.log(keyWord);
    // 首次访问,通知List更新状态
    PubSub.publish('User_Data', { isFirst: false, isLoading: true })
    // 发送请求
    axios.get(`/api1/search/users?q=${keyWord}`).then(
      // 请求成功,通知List组件更新状态
      response => {
        PubSub.publish('User_Data', { isLoading: false, userData: response.data })
      },
      // 请求失败了,通知List更新状态
      error => {
        PubSub.publish('User_Data', { isLoading: false, error: error.message })
      }
    )
  }
  render() {
    return (
      <section className="jumbotron">
        <h3 className="jumbotron-heading">Search Github Users</h3>
        <div>
          <input ref={c => { this.getKeycode = c }} type="text" placeholder="enter the name you search" />&nbsp;
          <button onClick={this.updateUserData} >Search</button>
        </div>
      </section>
    )
  }
}

4.List子组件

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

export default class List extends Component {

  state = {
    userData: [], //初始化状态为数组
    isFirst: true,  //是否第一次访问
    isLoading: false, //是否正在加载
    error: '' //返回错误
  }

  // List组件挂载时订阅
  componentDidMount() {
    // 订阅消息,接收改变的状态值
    this.token = PubSub.subscribe('User_Data', (_, data) => {
      this.setState(data)
    })
  }

  // List组件卸载时取消订阅
  componentWillUnmount() {
    PubSub.unsubscribe(this.token)
  }

  render() {
    // 获取状态
    const { userData, isFirst, isLoading, error } = this.state

    return (
      <div className="row">

        {
          /*判断是否是第一次访问 */
          isFirst ? <h2>欢迎您来访!!!</h2> :
            /* 判断是否正在加载中 */
            isLoading ? <h2>加载中。。。。。。。</h2> :
              /* 判断请求是否出错 */
              error ? <h2>出错了!?!?!?</h2> :
                /* 将请求到的数据渲染到页面 */
                userData.map(userObj => {
                  return (
                    <div className="card" key={userObj.id}>
                      <a href={userObj.html_url} rel="noreferrer">
                        <img alt='head-t' src={userObj.avatar_url} style={{ width: '100px' }} />
                      </a>
                      <p className="card-text">{userObj.login}</p>
                    </div>
                  )
                })
        }
      </div>
    )
  }
}

总结

请求数据

 Search组件与List组件之间通信

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
后台管理消息发布功能是许多网站和应用程序所必须的功能之一。它允许管理员或授权用户发布新闻、通知或其他重要信息,以便网站的访问者、用户或其他利益相关方可以及时了解和参考。 使用React实现一个后台管理消息发布功能,需要以下基本步骤: 1. 组件设计:确定发布消息的表单,包括标题、内容、发布时间等信息。然后,设计消息列表页面,包括各种消息的列表视图和详细内容视图。 2. 数据存储:确定如何存储消息数据。可以使用后端数据库存储数据,也可以使用第三方托管服务(如Firebase)存储数据。 3. 消息发布表单组件:为消息发布表单设计一个React组件。确定必填字段、表单验证和表单提交处理程序。使用Bootstrap或其他UI库来设计表单样式。 4. 消息列表组件:为消息列表设计一个React组件。使用React Router来设计消息详细信息的路由,使用户可以单击链接查看消息内容。 5. 消息数据获取:使用React生命周期方法,从后台或托管服务中获取消息数据并渲染到列表组件中。 6. 消息发布处理程序:当用户提交发布表单时,使用React的状态和Props特性,将新消息存储到后端数据库或托管服务中,并重新加载消息列表数据,以显示最新的消息列表。 总之,使用React设计和实现一个后台管理消息发布功能是一个有趣和有挑战性的任务。仔细计划组件设计和数据存储方法,使用良好的组织结构和模块化的代码,可以创造出一个功能强大、易于使用的后台管理系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值