react中父组件如何直接调用子组件的方法和属性,以及对比vue3.0父组件调用子组件的方法和属性

react中父组件如何直接调用子组件的方法和属性,以及对比vue3.0父组件调用子组件的方法和属性

react hook

forwardRef(render)
useImperativeHandle(ref, createHandle, dependencies?)

import {
  forwardRef,
  useEffect,
  useImperativeHandle,
  useRef,
  useState,
} from "react";

const ChildrenComponents = forwardRef(function ChildrenComponents(props, ref) {
  //useImperativeHandle类似于vue3.0的defineExpose,把子组件中要暴漏给父组件属性或方法,以对象的方式抛出去
  useImperativeHandle(
    ref,
    () => {
      return {
        initList,
        exposeParamter() {
          return {
            defaultTitleRef,
          };
        },
        defaultTitleRef,
        name,
        list,
      };
    },
    []
  );

  const defaultTitleRef = "我是子组件";

  let [name, setName] = useState("工藤新一");

  let [list, setList] = useState([
    {
      name: "工藤新一",
      sex: "男",
    },
    {
      name: "毛利兰",
      sex: "女",
    },
  ]);
  //初始化
  function initList() {
    console.log("[初始化子组件数据]");
  }

  function sendMessage() {
    // 类似于vue3.0的defineEmits
    props.click("点击子组件给父组件传值");
  }

  useEffect(() => {
    console.log("[useEffect-子组件]", props);
  }, []);
  return (
    <>
      <p>我是子组件:{name}</p>
      <br />
      <span onClick={sendMessage}>点击子组件给父组件传值</span>
    </>
  );
});

function Forward() {
  const childrenRef = useRef(null);

  let [title, setTitle] = useState("我想操作子组件的方法和属性");

  let [defaultName, setDefaultName] = useState("");

  let [list, setList] = useState([]);

  function getMessageHandle(params) {
    console.log("[我接收了子组件的传值]", params);
    console.log(childrenRef.current.list);
  }

  useEffect(() => {
    console.log("[useEffect-父组件如何直接调用子组件的方法和属性]");
    childrenRef.current.initList();
    console.log("", childrenRef.current.exposeParamter().defaultTitleRef);

    console.log("[name]", childrenRef.current.name);
    setDefaultName(childrenRef.current.defaultTitleRef);

    setList(childrenRef.current.list);
  }, []);
  return (
    <>
      <p>forwardRef:我是父组件</p>
      <p>{defaultName}</p>
      {/* react通过标签的属性传值 */}
      <ChildrenComponents
        ref={childrenRef}
        title={title}
        click={getMessageHandle}
      />

      {list.map((item, index) => {
        return (
          <p key={index}>
            {item.name}-{item.sex}
          </p>
        );
      })}
    </>
  );
}

export default Forward;


vue setup

父组件

<template>
	<div>组件</div>
	<button @click="getHandle">ok</button>
	<ChildrenComponent :title="title" :paramsObject="paramsObject" ref="childrenRef" @clickHandle="operateHandle" />
	{{paramsObject.name}}
</template>

<script setup>
	import {
		onMounted,
		ref
	} from "vue";
	import ChildrenComponent from "../components/children.vue";

	let title = ref("组件传值");

	const childrenRef = ref(null)

	onMounted(() => {
		childrenRef.value.initFunction();
		console.log("[父组件]", childrenRef.value.defaultTitle)
	})

	let paramsObject = ref({
		name: "父组件",
		age: 29,
		sex: '男'
	})

	function getHandle() {

	}

	function operateHandle(params) {
		console.log("[params]", params)
		paramsObject.value.name = params.name;
		console.log("[paramsObject]", paramsObject)
	}
</script>

<style>
</style>

子组件

<template>
	<div>我还是个孩子</div>
	<h1>{{props.title}}</h1>
	<button @click="btnHandle">点击按钮</button>
</template>

<script setup>
	import {
		defineProps,
		defineExpose,
		defineEmits,
		ref
	} from "vue";

	const props = defineProps({
		title: {
			type: String,
			default: () => {
				return ''
			}
		},
		paramsObject: {
			type: Object,
			default: () => {
				return {}
			}
		}
	});

	const emits = defineEmits(["clickHandle"]);

	console.log("[children]", props.paramsObject)

	function initFunction() {
		console.log("[初始化]")
	}

	function btnHandle() {
		console.log("[ok]")
		emits("clickHandle", {
			name: '毛利兰'
		})
	}

	let defaultTitle = ref("我是子组件")

	defineExpose({
		initFunction,
		defaultTitle
	})
</script>

<style lang="scss" scoped>
</style>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中,要实现组件调用组件方法,可以使用`$refs`来获取组件的引用,然后通过`$emit`来触发孙组件方法。首先,在组件中,我们需要给孙组件添加一个`ref`属性,以便能够引用到它。例如,在组件中添加一个Button按钮,并在点击事件中调用`handleClick`方法,在该方法中使用`$refs`来引用孙组件,并通过`$emit`来触发孙组件方法。代码如下: ```html <template> <div> <Button @click="handleClick">点击调用组件方法</Button> <Child ref="child" /> </div> </template> <script> import Child from './child'; export default { methods: { handleClick() { this.$refs.child.$emit("childFun") //组件$on中的名字 }, }, } </script> ``` 在上述代码中,我们通过`this.$refs.child`来获取到孙组件的引用,然后使用`$emit`来触发孙组件中名为`childFun`的方法。这样就实现了组件调用组件方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue组件调用组件中的方法 及vue组件调用组件方法](https://blog.csdn.net/Jonn1124/article/details/117478603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [react通过hook实现组件调用组件方法(非redux)](https://blog.csdn.net/litter_jason/article/details/125319436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值