1、React 开发调试工具 安装
1、Google 商店 https://chrome.google.com/webstore/category/extensions?hl=zh 2、react dev tools 就会变成黑色 复制代码
网络异常,图片无法展示
|
- 组件信息 也比较方便,可以看到组件结构
2、propTypes 和 defaultProps
* 如何对接收参数 类型定义, 默认值如何做校验 ?
网络异常,图片无法展示
|
- 当我尝试 更改 index 为 string 时
网络异常,图片无法展示
|
- 当父组件并未传递 某个值,子组件却使用到了,怎么处理?
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 可以限制 必须传递
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 如果 父 组件确实没有 则 可以添加一个 默认值
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 官方文档还有 一件事情 需要注意
可以有多种类型
- 先尝试 敲一下
网络异常,图片无法展示
|
网络异常,图片无法展示
|
3、props, state, render 再思考
两个重要的内容
1、当组件的 state 和 props 发生变化时, render 会重新执行,渲染页面 2、父组件 render 执行 默认 子组件的 render 也会执行(shouldComponentUpdate默认情况下为true) 复制代码
- 举例子说明一下
state变化时 页面重新渲染
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 举例子说明一下
props 变化时 页面重新渲染 及 父组件 render 执行 子 render 也执行
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
4、什么是 虚拟 DOM ?
- 注意 本节 虚拟 dom 和真实 dom 生成顺序
暂时写反
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 对比 真实 DOM是 比较损耗性能大, 但对比 JS对象是 不损耗性能的
- 再尝试 敲一下 其实将 dom 转为 js 对象 写法也不困难
网络异常,图片无法展示
|
{/* <div id='div1' class="container"> <p>vdom</p> <ul style='font-size: 2px'> <li>a</li> </ul> </div> */} { tag: 'div', props: { className: 'container' id: 'div1' }, children: [ { tag: 'p', children: 'vdom' }, { tag: 'ul', props: { style: "font-size: 2px" }, children:[ tag: 'li', children: 'a' ] } ] } 复制代码
5、什么是 虚拟 DOM 补充?
网络异常,图片无法展示
|
- 也就是说 看到的
JSX 其实不是 真实的 DOM节点
网络异常,图片无法展示
|
- 将 dom 转为了 js 对象, 在原生应用当中 转为了对应的 语法表达
网络异常,图片无法展示|
6、什么是 虚拟 DOM 中的 diff 算法 ?
- 虚拟 DOM 只会进行一次 比对操作
网络异常,图片无法展示|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
为啥不要使用 index 作为 key 值原因
- 比如 当前 添加了三个内容
网络异常,图片无法展示|
- 这样就导致 无法 复用,因为 b c 当前的 key不对应 需要删除 重建
网络异常,图片无法展示
|
- 尝试将 key 值 更改为 不相同的(假设 item 不重复)
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
7、React 中 ref 使用 ?
- 目的是 拿到某个 dom 然后操作 dom 其实 e.target 也可拿到数据
- 比较细节 也比较基础的内容,较少用 ,
React 中 操作 某个 元素DOM
1、选择 某个元素 比如 (input) => this.input = input 2、在 setState 中使用 注意 这个异步函数需要 放在第二个参数 位置, 才能拿到state 更新后的值 复制代码
- 举例子说明一下 这个事情
使用 ref 选择某个元素
其实有几种方法
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- length 对应不上
网络异常,图片无法展示
|
- 注意 setState 第二个参数 是个 函数
网络异常,图片无法展示
|
网络异常,图片无法展示
|
8、React 生命周期 部分 ?
网络异常,图片无法展示
|
网络异常,图片无法展示
|
1、 初始化阶段 设置 props 和 state
网络异常,图片无法展示
|
2、挂载阶段
网络异常,图片无法展示
|
- 此处 注意
网络异常,图片无法展示
|
3、更新阶段
简单来说 数据发生变化时,执行, 数据变化体现在 props/state 变化
- 先不说WillReceiveProps 因为下面的流程两个相同
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 注意
componentWillReceiveProps 不会在顶层组件执行
网络异常,图片无法展示
|
网络异常,图片无法展示
|
4、卸载阶段
- 此处例子
删除 子组件时 执行 卸载
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 还需要注意一件事情 每个 组件都可以有这些生命周期函数
- 比如
父组件 render 子组件也可 render
9、React 生命周期 使用场景 ?
1、需要注意的事情, class 组件必须 需要 render 这个生命周期函数,因为 组件 extends React.Component 这个内置了其他的生命周期函数,没有 render
2、父组件更新 子组件也会默认更新,如何优化这个事情 ?
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 只会更新一次 ,只有 props 变化时 才会改变
网络异常,图片无法展示
|
性能优化方案 简述
1、setState 多次操作可以被合并 2、绑定 this 的操作放在 constructor 中 3、使用 scu 避免子组件多次重复渲染 4、使用 React.lazy 懒加载 5、使用 React.memo 检查 props 更改再变化 const MyComponent = React.memo(function MyComponent(props) {/* render using props */}); ``` 复制代码
- 生命周期函数中发送
异步请求 componentDidMount
? - 我们先假设直接在
render 中直接写会怎样
?
网络异常,图片无法展示
|
正确的姿势是 这样的
1、安装一个 axios 2、使用 3、注意 工作中常规 将 api 请求放在 thunk 中,直接调用 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
10、使用 Charles 进行接口数据模拟 ?
1、先使用 终端 touch item.json 在桌面新建一个文件,添加一点内容 2、打开 Charles 使用 tools --> map Local 3、填写端口后和信息 4、选择桌面 json 文件 5、浏览器 再次请求 成功后可以渲染数据 6、数据渲染 时候 通过更改 state 值 渲染数据 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
网络异常,图片无法展示
|
11、React 的 CSS 过渡动画 ?
- 新建一个 展示 css 的组件
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 添加一个 CSS 文件
网络异常,图片无法展示
|
12、React 中使用 css 动画效果 ?
- 需要 学会这样的简单使用
网络异常,图片无法展示
|
13、React 中使用 react-transition-group 实现动画 ?
- 使用这个
进行更加 复杂的动画模块编写,可用到工作上
1、安装 yarn add react-transition-group 2、按照文档引入使用 3、 复制代码
网络异常,图片无法展示
|
网络异常,图片无法展示
|
- 就可非常开心的看到效果
- 官方文档再次写在此处reactcommunity.org/react-trans…
再加一部分 内容 一组动画怎么添加 ? 需要使用到 group
1、使用 group 包裹 2、内层使用 cssTransition 复制代码
- 将代码 放在此处
- js
import { CSSTransition, TransitionGroup } from "react-transition-group"; import "./app.css"; class App extends Component { constructor(props) { super(props); this.state = { list: [] }; } handleAddItem = () => { this.setState((prevState) => { return { list: [...prevState.list, "item"], }; }); }; render() { return ( <> <TransitionGroup> {this.state.list.map((item, index) => { return ( <CSSTransition timeout={1000} classNames="fade" unmountOnExit appear={true} key={index} > <div>{item}</div> </CSSTransition> ); })} </TransitionGroup> <button onClick={this.handleAddItem}>toggle</button> </> ); } } export default App; 复制代码
- css
.show{ animation: show-product 2s ease-in forwards; } .hide{ opacity: 0; transition: all 1s ease-in-out; } @keyframes show-product { 0%{ opacity: 0; color: red } 50%{ opacity: 0.5; color: yellow; } 100%{ opacity: 1; color: green; } } */ .fade-enter{ opacity: 0; } .fade-enter-active{ opacity: 1; transition: all 1s ease-in-out; } .fade-enter-done{ opacity: 1; color: red; } .fade-exit{ opacity: 1; } .fade-exit-active{ opacity: 0; transition: all 1s ease-in-out; } .fade-exit-done{ opacity: 0; } 复制代码
- 非常感谢 本节完!
撒花 🎉🎉🎉
更多项目请访问 github github.com/huanhunmao
gitee 项目地址 gitee.com/huanhunmao/…