react在hook组件里边调用class子组件

前言

优化代码的过程不是一蹴而就的,庞大的代码量不可能几天就能完成从class到hook的更替,那么在这个过程中,我们就很可能遇到在hooks组件里边调用class子组件这种情况;

问题

当我使用hook父组件调用中间件嵌套的class子组件时,点击过一次后再次点击,定义的ChildRef 发生了丢失,且报错了

import React , { Component , useState} from "react"
import { withRouter } from "react-router-dom"

// 使用装饰器给裹上一层高阶函数(装饰器需要安装对应的babel包,此处作为演示使用)
@withRouter 
class Child extends Component {
	componentDidMount(){
		this.props.onRef && this.props.onRef(this);
	}
	func(){
		console.log("执行我")
	}
	render(){
		return (<div>子组件</div>);
	}
}

const Parent = (props)=>{
	const [count, setCount] = useState(0);
	const ChildRef = null;
	
	function handleOnClick(){
		ChildRef.func();
		setCount(count++);
	}

	return (<div>
		<button onClick={this.handleOnClick}>click</button>
		<Child onRef={ node => ChildRef = node }></Child>	
	</div>);
	
}

分析原因

hooks函数组件中,每次触发state变化时,除了useState会保存值,其他的变量和函数都会发生重置;

hooks父组件更新了,但是子组件class却仅仅只会让render函数发生变化,不会重新挂载, 然后我们的ChildRef重回赋值了null;

那么这就是我们再次点击失效的原因了,那怎么解决呢?

解决办法

在class子组件的componentWillReceiveProps中重新调用一次onRef,如下所示

  componentWillReceiveProps(nextProps) {
    nextProps.onRef && nextProps.onRef(this);
  }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值