今天本来正在工位上写着一段很普通的业务代码,将其简化后大致如下:
function App(props: any) {// 父组件const subRef = useRef<any>(null)const [forceUpdate, setForceUpdate] = useState<number>(0)const callRef = () => {subRef.current.sayName() // 调用子组件的方法}const refreshApp = () => { // 模拟父组件刷新的方法setForceUpdate(forceUpdate + 1)}return <div><SubCmp1 refreshApp={refreshApp} callRef={callRef} /><SubCmp2 ref={subRef} /></div>}class SubCmp1 extends React.Component<any, any> { // 子组件1constructor(props: any) {super(props)this.state = {count: 0}}add = () => {this.props.refreshApp()// 会导致父组件重渲染的操作// 修改自身数据,并在回调函数中调用外部方法this.setState({ count: this.state.count + 1 }, () => {this.props.callRef()})}render() {return <div><button onClick={this.add}>Add</button><span>{this.state.count}</span></div>}}const SubCmp2 = forwardRef((props: any, ref) => { // 子组件2useImperativeHandle(ref, () => {return {sayName: () => {console.log('SubCmp2')}}})return <div>SubCmp2</div>})代码结构其实非常简单,一个父组件包含有两个子组件 。其中的组件2因为要在父组件中调用它的内部方法,所以用forwardRef包裹,并通过useImperativeHandle向外暴露方法 。组件1则是通过props传递了两个父组件的方法,一个是用于间接地访问组件2中的方法,另一个则是可能导致父组件重渲染的方法(当然这种结构的安排明显是不太合理的,但由于项目历史包袱的原因咱就先不考虑这个问题了\doge) 。
然后当我满心欢喜地
经验总结扩展阅读
- 装配 SpringBoot自动配置流程
- 如何从身份证号中提取年龄
- 如何把螃蟹杀掉(如何将螃蟹从洞里赶出来)
- 2023年9月26日是举办成人仪式的黄道吉日吗 2023年9月26日举办成人仪式行吗
- 2023年9月26日开学典礼行吗 2023年9月26日开学典礼好吗
- 2023年9月26日拜师学艺好吗 2023年9月26日拜师学艺黄道吉日
- 2023年9月26日是清扫房屋吉日吗 2023年9月26日清扫房屋黄道吉日
- 2023年9月26日堵蚂蚁洞黄道吉日 2023年9月26日适合堵蚂蚁洞吗
- 2023年9月26日是堵蚁穴吉日吗 2023年9月26日适合堵蚁穴吗
- 2023年9月26日剪头发黄道吉日 2023年9月26日是剪头发的黄道吉日吗
