当前位置: 首页 > article >正文

Vue3之setup参数介绍

setup(props, context) {
	...
}

一、参数

使用setup函数时,它将接受两个参数:

  • props
  • context

让我们更深入地研究如何使用每个参数

二、Props

setup函数中的第一个参数是props。正如在一个标准组件中所期望的那样,setup函数中的props是响应式的,当传入新的prop时,它将被更新。

export default {
	props: {
		title: String
	},
	setup(props, context) {
		console.log(props.title)
		...
	}
}

Warning:因为props是响应式的,你不能使用ES6解构,因为它会消除prop的响应式。

如果需要解构prop,可以通过使用setup函数中的toRefs来安全地完成此操作

import { toRefs } from 'vue

export default {
	props: {
		title: String
	},
	setup(props, context) {
		const { title } = toRefs(props)
		console.log(title.value)
		...
	}
}

三、context

context参数是一个普通的javascript对象,它对组件暴露三个属性:attrs、slots、emit。

export default {
	setup(props, context) {
		// Attribute(非响应式对象)
		console.log(context.attrs)
		
		// 插槽(非响应式对象)
		console.log(context.slots)
		
		// 触发事件(方法)
		console.log(context.emit)
	}
}

context是一个普通的JavaScript对象,也就是说,它不是响应式的,这意味着你可以安全地对context使用ES6解构。

export default {
	setup(props, { attrs, slots, emmit }) {
		...
	}
}

attrs和slots是有状态的对象,它们总是会随组件本身的更新而更新。这意味着你应该避免对它们进行解构,并始终以attrs.x或slots.x的方式引用property。

请注意,与props不同,attrs和slots是非响应式的。如果你打算根据attrs或slots更改应用副作用,那么应该在onUpdated生命周期钩子中执行此操作。

访问组件的property

执行setup时,组件实例尚未被创建。因此,你只能访问以下property:

  • props
  • attrs
  • slots
  • emit

换句话说,你将无法访问以下组件选项:

  • data
  • computed
  • methods

在setup()内部,this不会是该活跃实例的引用因为setup()是在解析其他组件选项之前被调用的,所以setup()内部的this的行为与其他选项中的this完全不同。这在和其他选项式 API一起使用setup()时可能会导致混淆。

1、attrs

用途:当父组件传递数据给子组件时,子组件不通过props接收,那么父组件传递的数据就到了setup中的context的attrs属性。

<div id="app">
<!-- 父组件传递数据给子组件 -->
<son webName="自如初"></son>
</div>

<script>
const app = Vue.createApp({
});

// 子组件不使用props接收
app.component('son', {
 template:`<div>son</div>`,

 setup(props, context) {
  const { attrs, slots, emit} = context;
  // 打印父组件传递的数据
  console.log(attrs.webname);
  return {};
 }
});
const vm = app.mount('#app');
</script>

2、slots

用于接收渲染父组件传递的插槽内容

<div id="app">
<son>
 父组件通插槽传递的内容
</son>
</div>

<script>
const app = Vue.createApp({
});

app.component('son', {
 template:`<div>son</div>`,

 setup(props, context) {
  const { h } = Vue;
  const { attrs, slots, emit} = context;
 
  // 显示父组件传递的内容
  return () => h('p', {}, slots.default());
 }
});
const vm = app.mount('#app');
</script>

3、emit

向父组件触发事件。

<div id="app">
<!-- 4、父组件监听子组件发射的事件 -->
<son @sclick="getData"></son>
</div>

<script>
const app = Vue.createApp({
 methods: {
  // 5、实现事件
  getData () {
   alert(1)
  }
 }
});

app.component('son', {
 // 1、子组件中绑定事件
 template:`<div @click="sonClick">son</div>`,

 setup(props, context) {
  const { attrs, slots, emit} = context;
 
  function sonClick() {
   // 2、通过 emit 向父组件发射事件
   emit('sclick');
  }

   // 3、对外暴露该事件
  return { sonClick };
 }
});
const vm = app.mount('#app');
</script>

4、使用渲染函数

setup还可以返回一个渲染函数,该函数可以直接使用在同一作用域中声明的响应式状态:
在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/15633.html

相关文章:

  • [ 网络安全介绍 3 ] 网络安全事件相关案例有哪些?
  • WEB服务器实现(药品商超)
  • C++学习-空指针推荐使用nullptr
  • HOW - PPT 制作系列(一)
  • 如何让手机ip变成动态
  • vue+svg圆形进度条组件
  • Java学习过程(韩顺平661-665)
  • 浅谈测试用例设计 | 京东云技术团队
  • 【HQL - 查询用户的累计消费金额及VIP等级】
  • 霍兰德人格分析雷达图
  • 【Qt】根据界面所在显示器自适应调整ui大小
  • 省钱!NewBing硬核新玩法;手把手教你训练AI模特;用AI替代同事的指南;B站最易上手AI绘画教程 | ShowMeAI日报
  • Raft 共识算法4-选举限制
  • 【JavaEE初阶】多线程(四)阻塞队列 定时器 线程池
  • async函数学习总结
  • Navicat和Dbeaver有什么区别
  • Java --- springboot2的静态资源配置原理
  • 轻量级「行泊一体」爆发前夜!这家智驾Tier1正加码抢占市场
  • VC++运行时库整理
  • Word转PDF:简单步骤,轻松完成!推荐两个实现的方法
  • 为什么重写equals时必须重写hashCode()
  • 【容器化应用程序设计和开发】2.2 Dockerfile 的编写和最佳实践
  • ChatGPT会一直火热下去吗?他会是下一个AR,区块链吗?
  • WRF模式应用:天气预报、模拟分析观测气温、降水、风场、水汽和湿度、土地利用变化、土壤及近地层能量水分通量、土壤、水体、植被等相关气象变量
  • 分治算法(Divide and Conquer)
  • Winform从入门到精通(34)—SaveFileDialog(史上最全)