纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

vue3 setup() 用法 vue3 setup() 高级用法示例详解

前端人   2021-11-19 我要评论
想了解vue3 setup() 高级用法示例详解的相关内容吗前端人在本文为您仔细讲解vue3 setup() 用法的相关知识和一些Code实例欢迎阅读和指正我们先划重点:vue3,setup(),用法,vue3,setup(),使用下面大家一起来学习吧。

本篇文章干货较多建议收藏!

从 vue2 升级到 vue3vue3 是可以兼容 vue2 的所以 vue3 可以采用 vue2 的选项式API。由于选项式API一个变量存在于多处如果出现问题时就需要去多个函数内检查项目较大时遇到问题增加排故的难度。所以 vue3 中新增了 setup 配置项用它来写组合式API。

一、选项式API 和 组合式API 区别

有些同学稀里糊涂用了vue一年了竟然不知道选项式api !你是那个同学吗?是的话赶紧收藏起来。

vue2 中的 Options API 就是选项式api一个中文一个英文怎么叫都可以。

在一个 vue 文件内会有 data、methods、mounted、computed、watch 等等用来定义属性和方法共同来处理页面逻辑我们把这种方式称为 Options API。

示例1:计数器

<template>
 <div>
  <button @click="add">+</button>
   {{num}}
  <button @click="reduce">-</button>
 </div>
</template>
<script>
export default {
 data(){
  return {
   num:0
  }
 },
 methods:{
  add(){
   this.num++
  },
  reduce(){
   this.num--
  }
 }
}
</script>

观察上述示例我们发现 num 值的处理涉及到 data 和 methods 两个选项业务处理的比较分散项目小了看着清晰明了但是项目变大之后data 和 methods会包含很多属性和方法此时就很难分清哪个属性对应哪个方法。所以 vue3 新增 setup 写组合式API。

Vue3 的 Composition API 就是组合式api。

组合式api 就是一个功能所定义的 api 会放在一起这样子即使项目变大功能增大我们能够很快找到功能相关的所有api不像 Options API 功能分散需要改动时需要多处查找过程比较困难。

示例2:计数器

<template>
 <div>
  <button @click="add">+</button>
   {{num}}
  <button @click="reduce">-</button>
 </div>
</template>
<script>
 import { ref } from 'vue'
 export default{
  setup(){
   const num = ref(1)
   return{
    num,
    add(){
     num.value++
    },
    reduce(){
     num.value--
   }
  }
 }
}
</script>

ref 是让基础数据类型具备响应式的下篇文章具体介绍它的用法需要的同学可以点个关注不迷路!

用一张图告诉你它们的区别:

二、setup 具体怎么用?

2.1、setup 什么时候执行?

setup 用来写组合式 api从生命周期钩子函数角度分析相当于取代了 beforeCreate 。会在 creted 之前执行。

<script>
 export default{
  created(){
   console.log('created');
  },
  setup(){
   console.log('setup');
  }
 }
</script>

执行之后setup 打印结果始终在前边。

2.2、setup 数据和方法如何使用?

示例3:直接定义使用变量

<template>
 {{a}}
</template>
<script>
 export default{
  setup(){
   const a = 0
  }
 }
</script>

运行后发现结果异常:

runtime-core.esm-bundler.js?5c40:6584 [Vue warn]: Property "a" was accessed during render but is not defined on instance.

提示我们访问的属性 a 并没有挂载到实例上。

setup 内部的属性和方法必须 return 暴露出来将属性挂载到实例上否则没有办法使用上述代码添加return:

<script>
 export default{
  setup(){
   const a = 0
   return{
    a
   }
  }
 }
</script>

2.3、setup 内部有 this 吗?

自己在 setup 中打印下 this 返回结果 是undefined 。说明在 setup 内部是不存在 this 不能挂载 this 相关的东西。

2.4、setup 内钩子函数如何使用?

vue3 是可以兼容 vue2 的选项式写法所以 钩子函数可以与 setup 并列存在就相当于 Options API。

示例4:

export default{
 setup(){
  console.log('setup');
 },
 mounted(){
  console.log('mounted');
 }
}

vue3 新增的 setup() 函数用来写组合式 api所以不建议这样写代码。所以需要使用 onXXX 一族的函数来注册钩子函数注册成功之后调用时传递的是一个回调函数。

示例5:

import { onMounted } from "vue";
export default{
 setup(){
  const a = 0
  return{
   a
  },
  onMounted(()=>{
   console.log("执行");
 })
 }
}

注册的这些生命周期钩子函数只能在 setup 期间同步使用因为它们依赖全局内部状态来定位当前组件实例不在当前组件下调用函数时会抛出错误。

其他的钩子函数是一样的根据需要引入就好了。

2.5、setup与钩子函数关系

setup 与钩子函数并列时setup 不能调用生命周期相关函数但生命周期可以调用 setup 相关的属性和方法。

示例6:

<template>
 <button @click="log">点我</button>
</template>
<script>
export default{
 setup(){
  const a = 0
  return{
   a
  }
 },
 methods:{
  log(){
   console.log( this.$options.setup() );//返回一个对象
  }
 }
}
</script>

this.$options.setup() 返回的是一个大对象该对象内包含了 setup 内的所有属性和方法。

三、setup 参数

使用setup 时它将接收两个参数:props 和 context 。

3.1、props

第一个参数是 props 表示父组件给子组件传值props 是响应式的当传入新的 props 时自动更新。

示例7:

export default{
 props: {
  msg: String,
  ans: String,
 },
 setup(props,context){
  console.log(props);//Proxy {msg: "着急找对象", ans: "你有对象吗?"}
 },
}

因为 props 是响应式的不能使用 ES6 解构会消除prop的响应特性此时需要借用 toRefs 解构。示例8:

import { toRefs } from "vue";
 export default{
  props: {
   msg: String,
   ans: String,
  },
  setup(props,context){
   console.log(props);
   const { msgans } = toRefs(props)
   console.log(msg.value); //着急找对象
   console.log(ans.value); //你有对象吗?
  },
 }

使用组件时经常会遇到可选参时有些地方需要传递某个值有些时候不需要该如何处理呢?

如果 ans 是一个可选参数则传入 props 中可能没有 ans 。在这种情况下 toRefs 将不会为 ans 创建一个 ref 需要使用 toRef 代替它。

import { toRef } from "vue";
setup(props,context){
 let ans  = toRef(props ,'ans')// 不存在时创建一个ans
 console.log(ans.value);
}

3.2、context

context 上下文环境其中包含了 属性、插槽、自定义事件三部分。

setup(props,context){
 const { attrs,slots,emit } = context
 // attrs 获取组件传递过来的属性值
 // slots 组件内的插槽
 // emit 自定义事件 子组件
}

attrs 是一个非响应式对象主要接收 no-props 属性经常用来传递一些样式属性。

slots 是一个 proxy 对象其中 slots.default() 获取到的是一个数组数组长度由组件的插槽决定数组内是插槽内容。

setup 内不存在this所以 emit 用来替换 之前 this.$emit 的用于子传父时自定义事件触发。

示例9:

<template>
 <div :style="attrs.style">
  <slot></slot>  
  <slot name="hh"></slot>
  <button @click="emit('getVal','传递值')">子向父传值</button> 
 </div> 
</template>
<script>
import { toRefs,toRef } from "vue";
export default{
 setup(props,context){
  const { attrs,slots,emit } = context
  // attrs 获取组件传递过来 style 属性
 console.log('slots',slots.default());//插槽数组
 console.log('插槽属性',slots.default()[1].props); //获取插槽的属性   
 return{
  attrs,
  emit
   }
  },
 }
</script>

四、setup 特性总结

1、这个函数会在 created 之前执行上述已解释。

2、setup 内部没有 this不能挂载 this 相关的东西。

3、setup 内部的属性和方法必须 return 暴漏出来否则没有办法使用。

4、setup 内部数据不是响应式的。

5、setup不能调用生命周期相关函数但生命周期函数可以调用setup内的函数。


相关文章

猜您喜欢

  • java maven读取配置文件 java maven项目怎样读取配置文件信息

    想了解java maven项目怎样读取配置文件信息的相关内容吗frank12-12在本文为您仔细讲解java maven读取配置文件的相关知识和一些Code实例欢迎阅读和指正我们先划重点:java读取配置文件,maven项目,读取配置文件下面大家一起来学习吧。..
  • C# CheckedListBox控件用法 C#中CheckedListBox控件的用法实例

    想了解C#中CheckedListBox控件的用法实例的相关内容吗追梦人521在本文为您仔细讲解C# CheckedListBox控件用法的相关知识和一些Code实例欢迎阅读和指正我们先划重点:checkedlistbox选中项,c#,checkedlistbox控件用法,checkbox控件的使用下面大家一起来学习吧。..

网友评论

Copyright 2020 www.tdogsoftware.com 【零度软件园】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式