react16.3(4)的新特性
一、16.3 >> 16.4
1、修改了getDerivedStateFromProps的触发机制
父组件或自身的update都会触发getDerivedStateFromProps(nextProps, prevState)来返回对象来修改自身的state(16.3只有父组件会触发,为了实现17以后的异步渲染)
getDerivedStateFromProps(np, ps){
return {
next: np.next
}
// 相当于
setState({
next: np.next
})
}
2、ComponentDidUpdate新增了第三个参数snapshot来保存getSnapshotBeforeUpdate返回的对象(16.3新增)
componentDidUpdate (pp, ps, snapshot) {
// snapshot === {
// name: 'haha'
// }
}
3、全新的ref的创建方式,放弃了以前使用回调函数或者字符串的形式(16.3)
1)、createRef
const Child=React.forwardRef((props,ref)=>(
<input ref={ref} />
))
class Father extends React.Component{
constructor(props){
super(props);
this.myRef=React.createRef();
}
componentDidMount(){
console.log(this.myRef.current);
}
render(){
return <Child ref={this.myRef}/>
}
}
2)、高阶组件中传递ref
class Child extends React.Component {
constructor(props) {
super(props);
}
render() {
return < input / >
}
}
function logProps(Component) {
class LogProps extends React.Component {
componentDidUpdate(prevProps) {
console.log('old props:', prevProps);
console.log('new props:', this.props);
}
render() {
const { forwardedRef, ...rest } = this.props;
return < Component ref = { forwardedRef } { ...rest }/>;
}
}
return React.forwardRef((props, ref) => {
return <LogProps {...props} forwardedRef={ref} / > ;
});
}
const LogProps = logProps(Child)
class Father extends Component {
constructor(props) {
super(props)
this.myRef = React.createRef()
}
render() {
return ( <LogProps ref={this.myRef} /> )
}
}
react 16.3之前HOC的中ref的传递方式
class Child extends Component {
state = {
call: 'child'
}
render () {
return (
<div>Child</div>
)
}
}
const setInstance = function (Element) {
return class extends Component {
render () {
const props = { ...this.props }
const { getInstance } = props
if (typeof getInstance === 'function') {
props.ref = getInstance
}
return (<Element {...props} />)
}
}
}
const Wrapper = function (Com) {
return class extends Component {
render () {
let props = { ...this.props }
return (<Com {...props} />)
}
}
}
const HOC = Wrapper(setInstance(Child))
class Parent extends Component {
state = {
call: 'parent'
}
componentDidMount () {
console.log(this.child)
}
render () {
return (
<div>
Parent
<HOC getInstance={(child) => this.child = child}/>
</div>
)
}
}
// 实质上就是this的传递
三、增加了对pointEvent的支持,但自身并不做兼容,需使用第三方插件
即整合了click,touch和触控笔点击的事件使用方法和onClick一样

浙公网安备 33010602011771号