Github搜索案例

        今天的内容是这个案例的实现,以及其中涉及到的内容,需要全部掌握,比如ref,受控组件,props在组件之中的传递,以及Pubsub包的使用这些前端React框架有关的内容。现在进入正题

1.github搜索案例(axios)

     

          我们直接导入静态页面,这个方面html,css引入到组件拆分,我们就不说了,直接跳过。我们分为3个组件,首先App组件,Search组件以及List展示组件。

         现在我们分好了组件也引入了静态html以及css之后页面是这个效果

             图片我们暂时随便的用一种,现在我们首先要做的就是,我们要在Search组件中,实现一个效果,就是我们在点击Search按钮的时候,我们能够去发送一个请求给服务器对应的端口上的服务,然后服务给我们一些我们搜索相关的数据返回,然后我们把这些数据想办法给List组件,然后让List组件展示出我们搜索出来的内容。

        

        首先添加一个点击事件,当按钮被点击的时候,我们触发函数,那么在这个函数中,我们发送请求之前需要获取input输入框的value值,因为我们搜索的关键字是我们自己输入的,但是现在我们发生事件的元素并不是我们需要获取value的元素,这时候我们就有两种办法,在按钮元素点击事件的时候拿到别的元素的value。

        1.ref

        我们直接给input设定ref ={event=>{this.keyWord = event}}相当于在ref中搞了一个箭头函数,函数定义了我们Search类组件的一个新的实例对象值是当前元素input,这样我们就可以在点击事件发生的时候通过this.target.value拿到我们的内容,然后发送请求的时候作为参数传给服务器。

        

      2.受控组件

        受控组件就是当我们用jsx去写一个标签元素的时候,我们可以在state中设置一个value值为空,然后给input添加onChange监听事件比如onChange={this.getValue},当监听到变化的时候,函数执行,更新this.setState({value:event.target.value}) 就也可以获取到value值。然后我们点击事件中直接用this.state.value可以直接使用value作为参数传给服务器了。

        

     这是简单一个示例,可以帮助我们去理解。

       那么我们Search组件就可以进行下一步了。发送请求获得返回数据。我们这里使用的axios第三方库。我们npm add axios安装库之后引入就可以axios方法了。

                

        这里发送请求无非三个关键点,要有发送的地址,

                

        还要有method params。不过我现在只是学习前端内容,这些并未涉及到,所以我只是知道有这个东西。这里我们希望是获取与我们输入内容相关的用户名信息,所以是get请求。

        

        在这段代码中,我们用axios.get方法向https://api.hithub.com/search.users发送请求,参数是我们的value。

        

        这是一个实例promise对象,我们在这后面用.then方法,里面的内容是如果请求发送成功,就输出response.data 也就是返回来的数据,报错就报错

        

        这里我们控制台可以看到输出了内容,也就是我们响应体,也就是服务传给我们的数据内容。我们要展示的就是items这个数组,也就是我们要的用户信息。

        这里我们是直接请求到github这个地址上的服务,为什么没有跨域呢,因为github配置了cors,虽然不知道是什么,但是有了cors大家都可以在自己的服务器上直接访问到github然后拿回数据,但是我们这样频繁的访问会出错,这时候我们就希望自己有一个代理服务器,上面有2个服务,也就是说,如果github因为频繁访问出错,我们就用服务2,里面存放固定的数据给我们,这样能保证我们只要通过代理服务器发送了请求,肯定是有数据回来的。

        我们打开代理服务器

        

        我们现在只学的前端,服务器相关的只是知道是什么就行,不用知道原理。

        但是这个服务器打开了我们就会有跨域的问题了,我们setupProxy.js配置代理服务器,我上一章以及提到过了,还有一个问题是我的电脑5000端口用不了,我这个电脑5000端口一直被占用,所以我这边服务改为3002端口。

        代理服务器搞定之后,我们直接访问代理服务器就可以返回数据了。

        

        我们需要的数据是items,然后我们现在输出的是response.data,那么response.data.items就是我们要用到的items。

        现在我们拿到了数据,我们只需要传给List组件就可以了。这些逻辑就是实现的逻辑,和TodoList是一样的。调用函数Search组件传返回的response.data.items用户信息给App组件,更新state,然后传给list遍历展示。

        剩下的功能是,发送请求的时候,希望搜索显示loading以及展示区域有一个欢迎的效果。

        

        那么我们首先loading,以及欢迎,还有展示的内容items,以及err。我们需要四个动态效果,也就对应四个数据动态变化驱动页面交互。我们现在先用props来传递,老公式,父组件App组件里面放state存四个数据。

        

        然后通过函数传给Search组件,这里我们要注意的是,当发送请求前,我们的页面是第一次打开,所以默认欢迎,当点击事件发生的时候,这时候我们就isFirst改为false,isLoading改为true,然后当发送请求后,当有数据返回也就是请求成功了,我们改isLoading为false,然后传users我们的items用户信息。

        剩下的就是App组件通过获取的对象直接合并更新state。然后传给List,List遍历items渲染出来用户信息到页面上,这样我们的搜索案例(axios)就完成了。

2.github搜索案例(Pubsub)

        那么在标题一的下面我们是通过props来传递数据的,这样在实际开发中有点不太适合,我们现在有一种新的方式,引入Pubsub订阅发布库,用里面的方法来直接实现Search组件和List组件之间的数据传递。

        

        这里是使用的方法,原理就像

        ​​​​​​​        

        用语言描述就是 A组件 想要 B组件的数据,那么A组件就要订阅一个 消息,然后定义消息名,B组件发布消息,然后把消息作为数据带过去给A。A订阅了就拿到了B数据。

        语言说出来很难理解,但写出来就很简单。

        

        首先不在需要App组件定义state当中间人传递数据,外壳组件可以真正的作为外壳组件使用了。那样就正常变成了,数据在那里,操作数据的方法就在那里。

        

        List展示state,所以我们定义在List组件中。

        

        Search组件来更新List组件里面的state,也就是说,

        通过钩子,也就是当页面加载完毕,就启动订阅,然后接收的参数默认两个,我们只需要后者,前者是消息名我们不需要就省略,消息名一致就可以订阅到对应发布的数据,然后页面将要关闭也就是卸载的时候,关闭订阅方法。

        然后就是Search组件在对应的时期通过PubSub.publish('me',{isLoading:false,users:response.data.items})把数据传给订阅的List组件。

        

        订阅发布可以直接实现图中勾选组件的数据传输,而不用一层层传递。

3.github搜索案例(fetch)

        那么我们现在实现了通过axios库(封装的xhr)发生请求,现在我们去学一种新的发生请求fetch,不需要引入。

        

        这是截取某个文章的内容

        

       中间的文字不需要在意,我们在意的是区别。不过我只学了前端,所以也暂且不用知道什么原理,只知道怎么用现在。

        我们把前面axios对应的方法改成fetch

        

       这个时候我们发现控制台输出的内容response并没有我们想要的data数据。

        

        ​​​​​​​

        如果写成这样,那么response就会包含我们的items。原理大概是--

        

        这里第一个.then为什么能用,因为fetch()是一个Promise实例对象,然后.then能链式使用,因为上一个.then返回的也是一个promise实例对象,这里的返回值指的是.then成功执行回调之后的返回值,而且返回值是一个response.json()也就是promise实例对象,如果.then指定的回调函数成功的返回值,是一个promise实例对象,那么这个promise实例对象就是整个.then方法的返回值,所以可以继续调用.then 方法

        首先第一个.then有两个回调,成功的和失败的。如果成功或者失败的执行的回调函数的返回值是一个非promise值,那么外侧的.then返回的promise实例状态是成功的,值是返回的非promise值。如果返回的本身就是一个promise值,那么这个值就是外侧.then所返回的promise实例的值,如果返回的是一个成功的promise实例而且值是1,那么.then返回的promise实例状态成功而且值是1,如果返回的是一个pending状态 的promise实例,那么外侧的.then就是一个pending状态的实例,如果异常,返回的promise状态就是失败的,原因就是抛出的异常

        上面是知识点,大概是这些。我只是了解即可现在。

        现在是实操,现在我们的返回值是一个response.json(),意味着这个当前的then返回值是一个promise实例,值和返回的promise.json()的值是一样的,也就是我们可以继续.then是因为上面的.then返回值是promise实例而且值也是promise.json()    

        

        

那么下一个.then执行response回调函数,用到promise实例对象值就是promise.json()

        

        这是第二次输出response的结果,包含了我们想要的item。这里我们的error下了多次,实际上是没必要的,我们优化一下。

        

        我们用.catch捕获错误如果有的话,然后输出错误。

        

        也可以这样去写,更加简洁,这里的async异步函数,所以必须加await。但这样可能出错拿不到出错。所以我们要这样写,

        

        这样就也可以捕获到错误并且输出了。

        通过这个搜索案例,里面的ref,props,以及PubSub订阅,以及通过状态的变化来驱动页面进行交互功能,这些前端的思路是完全通的,axios,fetch这些请求,只能说能大概的知道这个案例种的使用方法。毕竟现在是在学前端,其他的还是可以放一放的。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85301.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3学习(生命周期,hooks,axios的简单讲解)

一,前言 继续努力,南方见。 二,生命周期 1.对生命周期的理解 例如:人的生命周期,出生,经历,死亡 组件的话就是,创建,挂载,更新,销毁。***在特…

Pytorch实战四 基于 VGG net 搭建一个串联的神经网络结构

系列文章目录 文章目录 系列文章目录前言一、VGG类的搭建1.源码2.初始化类2.1 初始化函数2.2 前向传播函数 forward(self,x) 二、卷积补充卷积 前言 对于标准的 VGG net 输入图像的尺寸是 24 x 24,进行 32 维的下采样之后得到一个 7 x 7 的特征图,然后用 FC 层完成分…

大学专业解读——计算机

我们继续,讲讲排名第二流行的新工科专业——计算机。说到计算机,可能所有人都知道,但具体到细分的专业类别,除了计算机科学,其实大多数人都是不了解的。 序: 计算机主要有如下几个专业: 计算机…

Bootstrap 5学习教程,从入门到精通, Bootstrap 5 列表组(List Group)语法知识点及案例(14)

Bootstrap 5 列表组(List Group)语法知识点及案例 一、列表组基础语法 列表组是Bootstrap中用于显示一系列内容的灵活组件&#xff0c;常用于显示菜单、导航或任何项目列表。 基本列表组结构 <ul class"list-group"><li class"list-group-item&quo…

FPGA基础 -- Verilog 命名事件

Verilog 的“命名事件&#xff08;Named Events&#xff09;”机制 进行一次系统、专业的培训。该机制在 Verilog 中是比较冷门但重要的仿真控制特性&#xff0c;主要用于 模块间同步、行为仿真触发、事件通信&#xff0c;在复杂的 Testbench、行为模型中尤为重要。 一、命名事…

《Go语言圣经》结构体

《Go语言圣经》结构体 一、结构体指针的高效应用 在处理大型结构体时&#xff0c;为避免内存复制&#xff0c;通常使用指针传递和返回结构体&#xff1a; // 通过指针传入结构体&#xff0c;避免值拷贝 func Bonus(e *Employee, percent int) int {return e.Salary * percen…

Ascend上如何进行带宽测试

1 工具安装 1.1 下载链接 https://www.hiascend.com/developer/download/community/result?moduledl%2Bcann 1.2 安装指令&#xff1a; ./Ascend-mindx-toolbox_{version}_linux-{arch}.run --install设置环境变量&#xff1a; source /usr/local/Ascend/toolbox/set_env.…

生产BUG集

磁盘达到阈值导致ES无法删除数据 method [POST], host [http://xx.xxx.xxx.xxx:9200], URI [/security_event/_delete_by_query?slices1&requests_per_second-1&ignore_unavailablefalse&expand_wildcardsopen&allow_no_indicestrue&ignore_throttledtru…

基于FastAPI与Selenium的智能开关状态管理系统实践

引言 在工业物联网&#xff08;IIoT&#xff09;与自动化控制场景中&#xff0c;设备状态的实时监控与自然语言指令执行是提升效率的关键。本文将介绍一种基于 FastAPI 和 Selenium 的智能设备状态管理系统&#xff0c;通过大语言模型&#xff08;LLM&#xff09;解析用户指令…

主体和债项均为“AAA”等级 海尔消金发行10亿金融债

6月18日&#xff0c;继年内发行ABS、落地ESG挂钩银团贷后&#xff0c;海尔消费金融&#xff08;以下简称“海尔消金”&#xff09;在金融市场上又迈出重要一步&#xff0c;成功簿记发行2025年首期规模达10亿元金融债&#xff0c;且主体信用等级仍为“AAA”。这一举措为海尔消金…

n8n:轻松自动化您的工作流

借助开源自动化利器 n8n&#xff0c;释放重复劳动的生产力&#xff01; 引言 n8n 是一款免费、开源的工作流自动化工具&#xff0c;致力于帮助开发者和团队通过连接各种应用和服务&#xff0c;实现重复任务的自动化处理。 它由 Jan Oberhauser 于 2019 年在德国柏林创建&…

Angular--Hello(TODO)

最近有个小错误&#xff0c;因为最近还是在看thingsboard&#xff0c;最近终于看到前端的代码&#xff0c;突然发现怎么全是ts的文件&#xff0c;仔细一看原来并不是之前认为的AngularJS&#xff0c;而是Angular。。。我tm真的无语了&#xff0c;又要去重新学。。。 Angular的…

在 Linux 系统中通过 yum 安装 Sublime Text

在 Linux 系统中通过 yum 安装 Sublime Text 的步骤如下&#xff1a; ​步骤 1&#xff1a;导入 GPG 公钥​ sudo rpm -v --import https://download.sublimetext.com/sublimehq-rpm-pub.gpg 这一步用于验证软件包的合法性。 ​步骤 2&#xff1a;添加 Sublime Text 的软件仓…

面向自主多星对地观测的多智能体强化学习

大家读完觉的有帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; 抽象 近地轨道 &#xff08;LEO&#xff09; 卫星的指数级增长彻底改变了地球观测 &#xff08;EO&#xff09; 任务&#xff0c;解决了气候监测、灾害管理等方面的挑战。然而&#xff0c;多卫星系统…

flutter 短视频相关插件选型

​插件名称​​核心优势​​缺点​​短视频场景适用性​​推荐指数​​video_player​ (官方基础库)• 官方维护&#xff0c;跨平台兼容性最佳&#xff08;iOS/Android/macOS&#xff09; • 轻量级&#xff0c;无额外依赖&#xff0c;启动速度快 • 支持本地/网络视频、基础播…

QTableView为例:Qt模型视图委托(MVD)(Model-View-Delegate)

文章目录 1. QT中的MVD模式2. View3. Model4. Delegate5. 以TableView为例 1. QT中的MVD模式 模型视图委托&#xff08;MVD&#xff09;是Qt中特有的设计模式&#xff0c;类似MVC设计模式&#xff0c;将MVC设计模式中的Controller当做MVD中的Delegate&#xff0c;两者的概念基…

uni-app总结3-项目新建运行调试

一、新建项目 通过HbuilderX新建 在点击工具栏里的文件 -> 新建 -> 项目&#xff08;快捷键CtrlN&#xff0c;MacOS上是CMD N&#xff09;&#xff1a; 左测Tab选择uni-app类型&#xff0c;输入工程名&#xff0c;选择模板&#xff0c;Vue版本选择3&#xff0c;其他不…

LeetCode 每日一题打卡|若谷的刷题日记 4day--移动零

移动零 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1&#xff1a; 输入: nums [0,1,0,3,12] 输出: [1,3,1…

简历模板3——数据挖掘工程师5年经验

姓名 / Your Name 数据挖掘工程师 | 5年经验 | 推荐/画像/反欺诈 &#x1f4de; 138-XXXX-XXXX | ✉️ your.emailexample.com | &#x1f310; github.com/yourname | &#x1f4cd; 北京 &#x1f3af; 个人简介 / Summary 5年大厂数据挖掘工程经验&#xff0c;硕士学历&am…

Vue添加图片作为水印

直接上代码 把图片作为水印 <div class"info-warp"><div class"image-container"><img src"https://img.shetu66.com/2023/06/28/1687920981963810.png" /><div class"watermark-layer"><imgv-for"…