1. 条件渲染
(1)if - else 条件渲染
1 | export default function Greeting (props){ |
(2)&& 逻辑与条件渲染
1 | export default function Greeting (props){ |
- 需要注意的是数组的函数传值是 通过
进行的,而不是把数组展开,那样子就会变成一个对象
(3)三元表达式渲染
1 | export default function Greeting (props){ |
(4)阻止组件渲染
1 | export default function Greeting (props){ |
2. 列表渲染
1 | import React from 'react' |
2.1 Fragment 的使用 ★
n. | 碎片; 片段; |
---|---|
v. | (使) 碎裂,破裂,分裂 |
1 | export default function List(props) { |
jsx 表达式必须在一个根节点里面,使用 <React.Fragment>将其包裹在里面 。
2.2 react组合(类似vue中slot)
1 | export default function FancyBorder(props) { |
1 | ReactDom.render(<FancyBorder left={<div>左边内容</div>} right={<div>右边内容</div>}> |
3. style 的使用
3.1 style.js
1 | render(){ |
1 | //写成 style.js 样式 , 变成独立的文件 |
3.2 css 样式表 ★
1.安装 css 加载器 ★
修改 webpack.config.js
这个配置文件,为 css-loader
添加参数:
1 | npm install style-loader css-loader -D |
- 导入样式表
1 | import "./cmtlist.css" |
css 模块化只针对类选择器 和 Id选择器生效, 不会对标签选择器模块化
3.开启模块作用域 ★
1 | #1. webpack.config.js 修改css的rules规则,开启css的模块化 |
4.css 模块化的注意点
1 | /*默认情况下,所有的类和id样式都会被模块化*/ |
一般在开发过程中,我们需要引入很多的第三方css文件,为了让第三方css文件能够被友好的使用,我们一般不会对css文件开启模块化,一般都会给自己写的less 、 sass文件开启模块化。★★★
5.用 :global()包裹的样式不会被模块化 , 使用:local() 包裹的样式会被模块化,但是对于标签名的样式无效,还有默认就是local,可以省略。
4. react的事件处理
- 如果handleClick2是箭头函数,则函数中的this默认指向当前组件对象
- 如果handleClick2是普通函数,则函数中的this默认指向undefine
1 | <button onClick={this.handleClick2}>点我3</button> |
4.1 this 的问题
修改事件函数中this指向问题:
1.直接声明函数为箭头函数,此时函数中的this指向当前组件对象
2.绑定事件的时候,通过bind方法来修改this指向
1 | onClick={this.handleClick2.bind(this,'xx')} |
3.在构造函数中通过bind修改this指向
1 | constructor() { |
4.2 传参的问题★★
1.使用箭头函数传递参数
1 | onClick={() => this.handleClick("click") |
差别在于第二个写法会传递一个事件对象过去,然后我们可以通过该事件对象阻止
默认事件等等 , e.preventDefault 阻止默认事件 。★
2.通过bind来传递参数
1 | onClick={this.handleClick2.bind(this,'xx')} |
缺陷是不能传递事件对象
5. 受控组件和非受控组件
5.1 受控组件
受控组件又称为智能组件,顾名思义受控组件就是受到控制的组件,受控组件是数据的所有者,它拥有数据、且拥有操作数据的action。它可以使用自己的state数据,也可以将数据和操作action传递给子组件,让子组件来完成UI或者功能。
1 | <input type="text" value={this.state.age} onChange = {this.handleChange}/> 改不动的 value |
5.2 非受控组件
非受控组件不同于受控组件,它自身并不能拥有可改变的数据。因为函数组件只负责接收 props 并返回 UI,在真实的 React 应用开发场景下,我们经常尽可能的使用函数组件,将整个应用的 UI 拆分成尽可能小的视觉单元。
1 | <input type="text" ref="txt" defaultValue={this.state.age} onChange = {this.handleChange2}/> |
6. ref的用法
6.1 普通的用法
- ref 绑定一个普通的字符串
1 | { ref绑定一个普通字符串*/} |
6.2 React.createRef方法
1 | constructor(){ |
6.3 ref绑定回调函数
1 | //ref绑定回调函数 |
6.4 ref 的转发
Ref 转发是一个可选特性,其允许某些组件接收 ref,并将其向下传递(换句话说,“转发”它)给子组件。
简单解释:就是通过传递参数赋值的思想把父组件的 ref 赋值给子组件的 ref
1 | const FancyButton = React.forwardRef((props, ref) => ( |