明天次要学习ref办法去调用子组件的办法, react hook和vue 单文件都应用到
喜爱的能够点赞
React
useRef 仅能用在 FunctionComponent,createRef 仅能用在 ClassComponent。
应用useRef
子组件(Child.tsx)
# Child.tsxexport interface ChildProps { count: number; setCount: (params: ChildProps["count"]) => void;}const Child = (_props: any, ref: any) => { let [count, setCount] = useState(0); useImperativeHandle(ref, () => ({ count, setCount, })); return ( <div> <p>{count}</p> </div> );};export default Child;# orexport interface ChildProps { count: number; setCount: (params: ChildProps["count"]) => void;}interface refInterface { cRef: React.MutableRefObject<ChildProps | undefined>;}const Child: React.FC<refInterface> = (props) => { const { cRef } = props; let [count, setCount] = useState(0); useImperativeHandle(cRef, () => ({ count, setCount, })); return ( <div> <p>{count}</p> </div> );};export default Child;
父组件(Parent.tsx)
# Parent.tsxfunction Parent() { const childRef = useRef<ChildProps>(); const updateChildState = () => { // changeVal就是子组件裸露给父组件的办法 childRef.current?.setCount(childRef.current?.count + 1); }; return ( <div> <Child ref={childRef}></Child> <button onClick={updateChildState}>按钮</button> </div> );}
createRef
子组件(Child.tsx)
import React, { useState } from "react";interface ChildInterface { count: number;}class Child extends React.Component<unknown, ChildInterface> { constructor(props: React.FC) { super(props); this.state = { count: 0, }; } render() { return ( <div> <p>{this.state.count}</p> </div> ); } setCount = (params: number) => { this.setState({ count: params, }); };}export default Child;
父组件(Parent.tsx)
import Child from "./Child";class Parent extends React.Component { childRef: RefObject<Child>; // childRef: LegacyRef<Child> | undefined; constructor(props: React.FC) { super(props); this.childRef = createRef(); } render() { return ( <div> <Child ref={this.childRef}></Child> <button onClick={this.updateChildCount}>按钮</button> </div> ); } updateChildCount = () => { let { setCount, state } = this.childRef.current as Child; setCount(state.count + 1); };}export default Parent;
Vue3
父组件兼容二个写法
父组件(Parent.vue)
# Parent.vue<template> <Child ref="childRef"></Child> <button @click="onClick">按钮</button></template><script setup lang="ts">import { ref } from "vue";import Child from "./Child.vue";const childRef = ref<InstanceType<typeof Child>>();const onClick = () => { console.log(childRef.value); childRef.value?.setCount(childRef.value?.count + 1); childRef.value?.setCount2(childRef.value?.count2 + 1);};</script>
惯例写法
子组件(Child.vue)
# Child.vue<template> <div> <p>count: {{ count }}</p> <p>count2: {{ count2 }}</p> </div></template><script lang="ts">import { ref, defineComponent, Ref } from "vue";export default defineComponent({ data() { return { count2: 2, }; }, methods: { setCount2(param: number) { this.count2 = param; }, }, setup() { let count = ref(0); function setCount(param: number) { count.value = param; } return { count, setCount, }; },});</script>
单文件写法(setup)
<template> <div> <p>{{ count }}</p> </div></template><script setup lang="ts">import { ref } from "vue";const count = ref(0);function setCount(param: number) { count.value = param;}defineExpose({ count, setCount,});</script><style scoped></style>