持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
前言
今天是六月份更文活动第一天,最近都在写vue、angular项目,react基础的知识有些遗忘,所以索性带大家回顾一下react知识,同时起到巩固作用。
1.setState异步与同步问题
setState是我们最常用的更改状态的方法,那么setState到底是同步还是异步,其实是一个较为复杂的问题。 准确是说
setState只在合成事件(指react封装的事件,如onClick等)和钩子函数中是“异步”的,在原生事件和setTimeout中都是同步的。
用简单的话说就是:
(1)在同步任务中,setState异步更新数据及dom节点,等待任务执行结束,合并数据对象。
(2)在异步任务中,setState同步更新数据及dom节点,如settimeout、axios.then异步。
setState提供回调函数,可以获取到更新后的数据及dom节点
setState({},()=>{
// 获取更新后内容
})
推荐大家看一篇文章 你真的理解setState吗?
2.获取实例对象 ref绑定
在开发过程中,特别是类组件中,有时我们需要获取某些实例值如react,或者是获取子组件的方法或者属性,这种时候就可以使用ref绑定,不同于vue2,只需要绑定ref,使用this.$refs获取即可,react需要使用createRef创建Refs,并通过ref绑定组件,如果是类组件,ref绑定的值会指向类组件实例,从而获取实例上的属性与方法
(1)绑定实例
myref=React.createRef()
<input ref={this.myref} />
(2)获取实例值
this.myref.current.value
3.props属性
实际开发中,其实最常用的就是父子组件之间的通信,获取props等。本文回顾一下类组件、函数组件的传参接参过程,以及参数的验证。
类组件:
(1)类组件属性传入与解析
//使用组件时传入属性
<Movie title='movie' isshow={true}></Movie>
//组件内解析属性
import * as React from 'react';
export default class Movie extends React.Component{
render() {
const {title,isshow}=this.props
console.log(title,isshow)
return (
<div>
电影
</div>
);
};
};
(2)类组件属性类型验证
使用
prop-types做类型判断 使用类属性propTypes做类型验证
import * as React from 'react';
// 类型判断工具
import typeCheck from 'prop-types'
export default class Movie extends React.Component{
// 类型检查
static propTypes={
title:typeCheck.string,
isshow:typeCheck.bool
}
render() {
const {title,isshow}=this.props
console.log(this.props)
return (
<div>
电影
</div>
);
};
};
将传入isshow属性设为字符串,属性类型检查将报错
(3)设置默认属性
staic defaultProps={
isshow:false
}
(4) 利用es6进行属性展开,如果传入属性名与接收属性名相同,可以解构对象传入
var obj={title:'movie',isshow:false}
<Movie {...obj}></Movie>
函数式组件:
(1)函数式组件属性
export default function demo(props){
// 接收参数 props
}
(2)函数式组件属性类型检查及属性默认值
export default function demo(props){
// 接收参数 props
}
demo.propTypes={
}
demo.defaultProps={
}
4.表单受控组件与非受控组件
(1) 非受控组件
所谓非受控组件,就是可以使用ref来获取DOM节点实例,获取表单数据。 (2)受控组件 在HTML中,表单元素(如
<input>、<textarea>、<select>)通常自己维护state,并根据用户输入进行更新,而在React中,可变状态(mutable state)通常保存在组件的state属性中,并且只能通过setState()更新,我们结合两者,使React的state成为唯一数据源。渲染表单的React组件还控制着用户输入过程表单发生的操作,被React以这种方式控制取值的表单输入元素就叫做“受控组件”
state={
name:'test'
}
<input type='text' value={this.state.name} onChange=((event)=>{
this.setState({
name:e.target.value
})
}) />
5.插槽
(1)插槽有哪些优势:
- 复用度高,插槽可以实现组件的封装使用,并能够灵活使用不同的需求。
- 减少一定程度父子通信,通过使用插槽,部分内容可以留在父组件中,可以直接调用,减少了父子通信。
- 高阶组件的处理,可以使用插槽对子组件进行包裹处理,传入参数等。
(2)插槽的使用
- 匿名插槽
在子组件中,使用this.props.children拿到插槽传入的组件内容,并展开渲染。
import React, {Component} from 'react';
class Child extends Component{
render() {
return (
<div>
{this.props.children}
</div>
);
}
}
class Slot extends Component {
render() {
return (
<div>
<Child>
<div>子1111</div>
<div>子2222</div>
<div>子3333</div>
</Child>
</div>
);
}
}
export default Slot;
- 具名插槽
使用this.props.children可以决定插槽中具体展示哪些获取的组件内容
import React, {Component} from 'react';
class Child extends Component{
render() {
return (
<div>
<span>全部展示</span>
{this.props.children}
<span>具名插槽</span>
{this.props.children[2]}
{this.props.children[1]}
{this.props.children[0]}
</div>
);
}
}
6.dangerouslySetInnerHTML富文本解析渲染
富文本解析渲染其实较为少用,但是如果希望能够将富文本数据渲染到标签中,可以使用
dangerouslySetInnerHTML,注意html前是双下划线_。
state={
content:'<b>富文本渲染</b>'
}
<div dangerouslySetInnerHTML={
{
__html:this.state.content
}
}>
</div>