react_app 项目开发 (2)_axios_pubsub-js
生产环境打包并运行
yarn run build
会src代码进行打包处理,在内存中生成打包文件
将打包文件保存至内存
yarn global add serve
serve -s build
将 build 文件夹下所有资源加载到内存中
启动服务器,运行内存中的打包文件,通过浏览器访问 url
react 的 webpack 配置
- 查看 package.json 可以看到
npm run start 命令实际上是调用了 react-scripts start 命令
react-scripts 是 create-react-app 添加的一个 npm 包
所有的配置文件都藏在 node_modules/react-scripts 目录下,我们当然可以钻进这个目录去一探究竟
- 可以使用 npm run eject 来看清楚背后的原理,源码不可逆
当前目录下会增加两个目录
一个是 scripts ,另一个是 config
同时, package.json文件中的 scripts 部分也发生了变化:
组件间的数据传递
祖先组件 传递给 后代组件 : props 传递
后代组件 给 祖先组件 传递 : 后代组件调用 props 接收到的函数
async/await
- 作用:
简化 promise 的使用: 不用通过 then() 来指定异步的回调函数
以同步编码方式实现异步流程
- 哪里写 await?
在返回 promise 对象的表达式左侧指定 await, 这样就可以直接 promise 异步返回的结果
- 哪里写async?
await所在函数定义的左侧
事件处理机制
- DOM 事件
绑定事件
目标元素
事件名
回调函数: 接收数据并处理
触发事件
某动作目标元素的事件
事件名
数据都封装在 event 对象中
- 自定义事件 (如 消息发布/订阅机制)
- emit 触发
- dispatch 分发
绑定事件监听
自定义事件名
回调函数: 接收数据并处理
触发事件
手动触发
自定义的 事件名
自定义数据
componentWillReceiveProps (newProps){...}
// 初始时是不会调用的, 后面再接收到新的标签属性就会自动调用
使用消息订阅 (subscribe) - 发布 (publish) 机制
特点: 不强调组件关系
工具库: PubSubJS
下载: npm install pubsub-js --save // 加载到生产依赖
使用:
1. 引入 const PubSub = require("pubsub-js");
2. 提供的对象 PubSub
PubSub.subcribe(msgName, function(msgName, data){...}) // 订阅消息
PubSub.publish(msgName, data) // 发布消息
- 源码:
import React, { Component } from 'react'; import ROW from '../components/ROW/ROW'
import axios from "axios";
import PubSub from "pubsub-js"; class App extends Component {
constructor(props){
super(props);
this.state = {
isFirst: true,
fond: false,
errInfo:"",
responseData: []
};
this.userSearch = this.userSearch.bind(this);
} componentDidMount(){
PubSub.subscribe("keywords", async (msgName, searchName)=>{
this.setState({
isFirst: false,
fond: false,
errInfo:"",
responseData: []
});
try{
const result = await axios.get(`https://api.github.com/search/users?q=${searchName}`); // [{},{}...] 数组 被 map 处理返回每一项,[{},{}...]
let responseData = result.data.items.map((each, index)=>({
usarName:each.login,
picUrl:each.avatar_url,
gitUrl:each.html_url
})); this.setState({
responseData,
fond: true
});
}catch (e) {
this.setState({
errInfo:"请求出错,请稍后重试...",
fond: true
});
}
})
} async userSearch(){
const searchName = this.refs.nameInput.value;
if(searchName){
PubSub.publish("keywords", searchName);
this.refs.nameInput.value = ""
}
} render() {
const {responseData, isFirst, fond, errInfo} = this.state;
let tips = "";
if(isFirst){
tips = '请输入想要所搜的"用户名"';
}else if(!fond){
if(errInfo){
tips = errInfo;
}else{
tips = "Searching...";
}
}
return (
<div className="app">
<section className="jumbotron">
<h3 className="jumbotron-heading">Git 用户搜索:</h3>
<div>
<input ref="nameInput" type="text" placeholder="请输入想要搜索的 '用户名'"/>
<button onClick={this.userSearch}>Search</button>
</div>
</section>
<h3>{tips}</h3>
{
responseData.map((each, index)=>{
return <ROW key={index} info={each}/>;
})
}
</div>
);
}
} export default App;
react_app 项目开发 (2)_axios_pubsub-js的更多相关文章
- react_app 项目开发
react_app 项目开发 npm install -g create-react-app npm root -g // 查看安装包位置 创建项目 create-react-app m ...
- react_app 项目开发 (5)_前后端分离_后台管理系统_开始
项目描述 技术选型 react API 接口 接口文档,url,请求方式,参数类型, 根据文档描述的方法,进行 postman 测试,看是否能够得到理想的结果 collections - 创建文件取项 ...
- 项目开发---使用node.js中sass语法
前言:本文中所有sass文件都指后缀名为scss的文件.在此也建议使用后缀名为scss的文件,以避免sass后缀名的严格格式要求报错. 一.sass插件的安装: gulp-sass-china // ...
- react_app 项目开发 (3)_单页面设计_react-router4
(web) 利用 react-router4 实现 单页面 开发 SPA 应用 ---- (Single Page Web Application) 整个应用只有 一个完整的页面 单击链接不会刷新页面 ...
- react_app 项目开发 (4)_ React UI 组件库 ant-design 的基本使用
最流行的开源 React UI 组件库 material-ui 国外流行(安卓手机的界面效果)文档 ant-design 国内流行 (蚂蚁金服 设计,一套 PC.一套移动端的____下拉菜单.分页.. ...
- react_app 项目开发 (6)_后台服务器端-node
后台服务器端 负责处理前台应用提交的请求,并向前台返回 json 数据 前台应用 负责 展现数据与用户交互 发 ajax 请求与后台应用交互 yarn add axios /src/api/ajax. ...
- react_app 项目开发_遇到的坑
1. favicon.ico <link rel="shortcut icon" type="image/x-icon" href="./fav ...
- react_app 项目开发 (7)_难点集合
/src/App/Admin/Header 布局 import {Row, Col} from "antd" <div className="header_box& ...
- react_app 项目开发 (8)_角色管理_用户管理----权限管理 ---- shouldComponentUpdate
角色管理 性能优化(前端面试) 需求:只要执行 setState(), 就会调用 render 重新渲染.由于有时调用了 setState,但是并没有发生状态的改变,以致于不必要的刷新 解决: 重写 ...
随机推荐
- Entity Framework入门教程(10)---离线场景保存和删除实体/实体图集
离线场景保存和删除实体/实体图集 这一节的内容是在离线场景中保存实体和实体图集 在离线场景中,当我们保存一个离线的实体图集或一个单独的离线实体时,我们需要做两件事.首先,我们要把实体附加到新的上下文中 ...
- [物理学与PDEs]第2章习题7 一维不可压理想流体的求解
设有以 $x$ 轴为轴向的等轴截面管道, 其中充满着沿 $x$ 方向流动的不可压缩的理想流体, 在每一横截面上流体的状态相同, 且 $p=p(x)$. 若已知 $p(0) =p_1$, $p(L)=p ...
- Sql server not in优化
使用EXISTS(或NOT EXISTS)通常将提高查询的效率,由于NOT IN子句将对子查询中的表执行了一个全表遍历. oracle在执行IN子查询过程中,先执行子查询结果放入临时表再进行主查询: ...
- 【汇总目录】C#
[2019年04月29日] C# textbox 自动滚动 [2019年02月07日] C#利用VUDP.cs开发网络通讯应用程序 [2019年02月06日] C#利用VINI.cs操作INI文件 [ ...
- JS中小数相加相减时出现很长的小数点的解决方式
1.问题: 平时写的代码中会出现这种情况,parseFloat(11.3-10.1) 运行的结果依然是1.200000000000001 代码示例: var arr = [0.0111,11.002, ...
- Laravel 服务容器,IoC,DI
DI DI 就是常说的依赖注入,那么究竟什么是依赖注入呢? 打个比方,电脑(非笔记本哈)需要键盘和鼠标我们才能进行操作,这个‘需要’换句话说就是‘依赖’键盘和鼠标. 那么,相应的,一个类需要另一个类才 ...
- JVM虚拟机
一.JAVA虚拟机内存模型: 1.程序计数器:非常小的内存,用于存放下一条运行的指令: 每一个线程都必须有一个独立的程序计数器,用于记录下一条要运行的指令,是一块线程私有的内存空间,CPU时间切片 2 ...
- mysql的表映射
参考博客:https://blog.csdn.net/shushugood/article/details/79925150 1.服务器上的操作 在服务器上mysql创建一个实例,名为test_db, ...
- iOS 中的特殊字面量表示方法
转义字符\0(空字符).\\(反斜线).\t(水平制表符).\n(换行符).\r(回车符).\"(双引号).\‘(单引号).单字节 Unicode 标量,写成\xnn,其中nn为两位十六进制 ...
- Peer-to-Peer (P2P) communication across middleboxes
Internet Draft B. FordDocument: draft-ford-midcom- ...