• React 网络请求


    还是依赖熟悉的第三方库 axios

    一、普通axios请求 

    分为 搜索组件 和展示区组件   搜索组件成功请求回来数据后 在经过最外部组件来传导

    1. //import axios from 'axios';
    2. import React, { Component } from 'react'
    3. import './App.css';
    4. import Result from './component/Result';
    5. import Search from './component/Search';
    6. export default class App extends Component {
    7. state = {
    8. resultData:[],
    9. statepos:{
    10. isFirst:true,
    11. Loading:false,
    12. error:''
    13. }
    14. }
    15. initResData = (data,pos) =>{
    16. this.setState({
    17. resultData:data,
    18. statepos:{...this.state.statepos,...pos}
    19. })
    20. }
    21. componentDidMount(){
    22. console.log(233)
    23. }
    24. render(){
    25. console.log(123)
    26. return (
    27. <div className="container">
    28. <Search initResData={this.initResData}>Search>
    29. <Result {...this.state}>Result>
    30. div>
    31. )
    32. }
    33. }

    搜索组件:

    触发搜索按钮时 根据输入框的字符串发起请求,请求成功后map筛选出自己要用的数据 触发props 传进来的函数 、 数据转存到 父组件 state.reslutData中 并更新当前的状态 

    1. import axios from 'axios'
    2. import React, { Component } from 'react'
    3. export default class Search extends Component {
    4. initData = () =>{
    5. const keyStr = this.input1.value
    6. this.props.initResData(null,{isFirst:false,Loading:true})
    7. axios.get(`https://api.github.com/search/users?q=${keyStr}`).then(res =>{
    8. const arr1 = res.data.items.map(x =>{
    9. return {id:x.id,avatar_url:x.avatar_url,html_url:x.html_url,login:x.login}
    10. })
    11. this.props.initResData(arr1,{Loading:false})
    12. }).catch(err =>{
    13. this.props.initResData(null,{error:err.message,Loading:false})
    14. })
    15. }
    16. render() {
    17. return (
    18. <section className="jumbotron">
    19. <h3 className="jumbotron-heading">Search Github Usersh3>
    20. <div>
    21. <input type="text" ref={c => this.input1 = c} style={{width:'50%'}} placeholder="输入要搜索的登录名(避免汉字)"/> 
    22. <button onClick={this.initData}>Searchbutton>
    23. div>
    24. section>
    25. )
    26. }
    27. }

    展示结果组件:

    接过去渲染数据

    体验优化:三元表达式连续写法 一开始显示提示语  发送请求时 显示 Loading 

    刚进入页面是 isFirst : true 提示用户输入关键词进行检索

    发起网络请求时 isFirst : false  loading : true 提示等待动画

    请求成功 等待动画关闭 显示数据界面

    失败了就显示错误信息

    1. import React, { Component } from 'react'
    2. export default class Result extends Component {
    3. render() {
    4. const {resultData,statepos:{isFirst,Loading,error}} = this.props
    5. return (
    6. <div className="row">
    7. {
    8. // 三元表达式连续写法
    9. isFirst ? <h3>请输入用户名检索用户h3> :
    10. Loading ? <h3>Loadingh3> :
    11. error ? <h3 style={{color:'red'}}>{error}h3> :
    12. (resultData || []).map(x =>{
    13. return (
    14. <div className="card" key={x.id}>
    15. <a href={x.html_url} rel="noreferrer" target="_blank">
    16. <img src={x.avatar_url} alt='头像' style={{width:'100px'}}/>
    17. a>
    18. <p className="card-text">{x.login}p>
    19. div>
    20. )
    21. })
    22. }
    23. div>
    24. )
    25. }
    26. }

    二、请求成功的数据 使用发布订阅的模式传递

    最外部的组件:把子组件引入放进去 就可以了

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

    搜索组件:

    引入相关包

    import PubSub from 'pubsub-js'

    发送请求的时候发布消息

    PubSub.publish('消息的名称',{传递的数据})

    1. import axios from 'axios'
    2. import PubSub from 'pubsub-js'
    3. import React, { Component } from 'react'
    4. export default class Search extends Component {
    5. initData = () =>{
    6. const keyStr = this.input1.value
    7. PubSub.publish('wsg',{isFirst:false,Loading:true})
    8. axios.get(`https://api.github.com/search/users?q=${keyStr}`).then(res =>{
    9. const arr1 = res.data.items.map(x =>{
    10. return {id:x.id,avatar_url:x.avatar_url,html_url:x.html_url,login:x.login}
    11. })
    12. PubSub.publish('wsg',{resultData:arr1,Loading:false})
    13. }).catch(err =>{
    14. PubSub.publish('wsg',{error:err.message,Loading:false})
    15. })
    16. }
    17. render() {
    18. return (
    19. <section className="jumbotron">
    20. <h3 className="jumbotron-heading">Search Github Usersh3>
    21. <div>
    22. <input type="text" ref={c => this.input1 = c} style={{width:'50%'}} placeholder="输入要搜索的登录名(避免汉字)"/> 
    23. <button onClick={this.initData}>Searchbutton>
    24. div>
    25. section>
    26. )
    27. }
    28. }

    结果页的组件:

    组件挂载到页面上时就 实时的订阅 消息 根据接收的消息 this.setState 自己的状态

      componentDidMount(){
            this.token = PubSub.subscribe('wsg',(a,stateObj)=>{
          console.log(a) // 还是显示名字 wsg 所以一般用 _ 占位就行 也不使用
                this.setState(stateObj) // 只会已更新有的
            })
        }

    卸载时 就取消订阅消息

        componentWillUnmount(){
            PubSub.unsubscribe(this.token)
        }

    1. import React, { Component } from 'react'
    2. import PubSub from 'pubsub-js'
    3. export default class Result extends Component {
    4. state = {
    5. resultData:[],
    6. isFirst:true,
    7. Loading:false,
    8. error:''
    9. }
    10. componentDidMount(){
    11. this.token = PubSub.subscribe('wsg',(a,stateObj)=>{
    12. console.log(a) // 还是显示名字 wsg 所以一般用 _ 占位就行 也不使用
    13. this.setState(stateObj) // 只会已更新有的
    14. })
    15. }
    16. componentWillUnmount(){
    17. PubSub.unsubscribe(this.token)
    18. }
    19. render() {
    20. const {resultData,isFirst,Loading,error} = this.state
    21. return (
    22. <div className="row">
    23. {
    24. // 三元表达式连续写法
    25. isFirst ? <h3>请输入用户名检索用户h3> :
    26. Loading ? <h3>Loadingh3> :
    27. error ? <h3 style={{color:'red'}}>{error}h3> :
    28. (resultData || []).map(x =>{
    29. return (
    30. <div className="card" key={x.id}>
    31. <a href={x.html_url} rel="noreferrer" target="_blank">
    32. <img src={x.avatar_url} alt='头像' style={{width:'100px'}}/>
    33. a>
    34. <p className="card-text">{x.login}p>
    35. div>
    36. )
    37. })
    38. }
    39. div>
    40. )
    41. }
    42. }

  • 相关阅读:
    PowerBI真经连续剧
    如何隐藏自己的代码(很酷)
    Vatee万腾平台:数字经济时代的智能金融解决方案
    Splunk Workflow action 给我们带来的好处
    《java练级之路》多态!!!
    pycharm2023.3专业版安装后打开无反应
    温度响应性纳米水凝胶光子品体/纤维素修饰荧光水凝胶/载脂质体水凝胶的制备方法
    QPainter4.2.3-4.2.4
    Python3,os模块还可以这样玩,自动删除磁盘文件,非必要切勿操作。
    我该如何入门Python机器学习?
  • 原文地址:https://blog.csdn.net/benlalagang/article/details/126780260