setup的两个注意点

文章详细阐述了Vue2和Vue3中组件的setup函数的执行时机及参数,强调了props、$attrs和$slots的区别与使用。在Vue2中,未通过props接收的父组件属性存在$attrs,插槽内容在$slots中。Vue3的setup函数提供了更直接的context对象来访问这些属性和事件。同时,文章通过示例展示了如何在父子组件间传递数据和触发事件。
摘要由CSDN通过智能技术生成

一、setup的两个注意点


  • setup执行的时机

    • beforeCreate之前执行一次,this是undefined
  • setup的参数

    • props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性。
    • context:上下文对象
      • attrs: 值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性, 相当于 this.$attrs
      • slots: 收到的插槽内容, 相当于 this.$slots
      • emit: 分发自定义事件的函数, 相当于 this.$emit

二、vue2中的$attrs和$slots


  • 父组件给子组件传值时,子组价没有通过props接受,接受的值在$attrs中。
  • 插槽定义的值,存储到$slots中

父组件:App组件

<template>
  <div class="app">
    <h1>我的是Vue2写的效果</h1>
    <Demo msg="你好啊" school="尚硅谷">
      <template slot="test1">
        <span>青青子衿</span>
      </template>
      <template slot="test2">
        <span>悠悠我心</span>
      </template>
    </Demo>
  </div>
</template>

<script>
import Demo from './components/Demo.vue';
export default {
  components: {
    Demo
  }
}
</script>

<style scoped>
.app {
  background-color: skyblue;
  padding: 10px;
}
</style>

子组件:Demo组件

<template>
  <div class="demo">
    <h2>我是Demo组价</h2>
  </div>
</template>

<script>
export default {
  mounted() {
    console.log(this);
  }
}
</script>

<style scoped>
.demo {
  background-color: orange;
  padding: 10px;
}
</style>

在这里插入图片描述

三、vue3说明


  • 父组件:App组件
<template>
	<Demo @hello="showHelloMsg" msg="你好啊" school="尚硅谷">
		<template v-slot:qwe>
			<span>尚硅谷</span>
		</template>
		<template v-slot:asd>
			<span>尚硅谷</span>
		</template>
	</Demo>
</template>

<script>
	import Demo from './components/Demo.vue'
	export default {
		name: 'App',
		components:{Demo},
		setup(){
			function showHelloMsg(value){
				alert(`你好啊,你触发了hello事件,我收到的参数是:${value}`)
			}
			return {
				showHelloMsg
			}
		}
	}
</script>
  • 子组件:Demo组件
<template>
	<div>
		<h1>一个人的信息</h1>
		<h2>姓名:{{ person.name }}</h2>
		<h2>年龄:{{ person.age }}</h2>
		<button @click="test">测试触发一下Demo组件的Hello事件</button>
	</div>
</template>

<script>
import { reactive } from 'vue'
export default {
	name: 'Demo',
	props: ['msg', 'school'],
	emits: ['hello'],
	setup(props, context) {
		console.log('---setup(props)',props)
		console.log('---setup(context)',context)
		console.log('---setup(context.attrs)',context.attrs) //相当与Vue2中的$attrs
		console.log('---setup(context.emit)',context.emit) //触发自定义事件的。
		console.log('---setup(context.slots)', context.slots) //插槽
		//数据
		let person = reactive({
			name: '张三',
			age: 18
		})

		//方法
		function test() {
			context.emit('hello', 666)
		}

		//返回一个对象(常用)
		return {
			person,test
		}
	}
}
</script>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值