Vue3 setup 的作用实例详解

 更新时间:2022年12月29日 16:04:07   作者:清风 与我  
setup 用来写组合式 API,从生命周期的角度,相当于取代了 beforeCreate(),这篇文章主要介绍了Vue3 setup 的作用,需要的朋友可以参考下

从 vue2 升级 vue3,vue3 是可以兼容 vue2。所以 vue3 可以采用 vue2 的选项式 API,但是 vue2 不能使用 vue3 的组合式 API。

由于选项式 API 一个变量存在于多处,如果出现问题,就需要去涵盖多个函数。项目越大,排查的难度也就越大。

setup 具体怎么用:

setup 用来写组合式 API,从生命周期的角度,相当于取代了 beforeCreate()

setup 的数据和方法如何使用?

1.setup(){} 内部的属性和方法,必须用 return 暴露出来。

将属性挂载到实例上,否则没有办法使用。
语法糖:写在 script 开始标签中,内部的属性和方法,无需 return 暴露;
无法和选项式 API 混用。

2.setup 内部使用时,没有 this

3.钩子函数可以和 setup 并列存在

4.setup 不能调用生命周期相关函数,或者嵌套存在。

5.生命周期相关函数可以调用 setup 相关的属性和方法

6.可以使用 this

setup 参数

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

props:

  • 表示父组件给子组件传的数据;
  • props是响应式的,当数据发生改变时,自动更新
  • 因为 props 是响应式的,不能使用 Es6 的解构,如果使用会消除响应式特性(使用 toRefs)

context:

上下文环境。其中包括了,属性,插槽,自定义事件三个部分。

  • attrs:是一个非响应式对象,主要接受 no-props(非props)属性。经常用来传递一些样式/标签特有属性。
  • slots:是一个 Proxy 对象,其中 slots.default() 获取到一个数组。数组长度表示插槽的数量,数组中的元素是插槽的内容。
  • emit:因为在 setup 中没有 this,所以使用 emit 来替换之前的 this.$emit(‘自定义事件名称’,传递的值)。用于子传父时,自定义事件的触发
  • 示例:emit(‘自定义事件名称’,传递的值)

setup 特性总结:

  • 这个函数会在 created 之前执行。
  • setup 内部没有 this,不能挂载 this 相关的东西
  • setup 内部的属性和方法,必须 return 暴露出来。(语法糖中不需要)
  • setup 内部的属性都不是响应式的;
  • setup 不能调用生命周期相关函数,但生命周期相关函数可以调用 setup

setup 在代码中的使用

<script>
import { onMounted, toRefs } from "vue";
export default {
  props: {
    msg: "abc",
  },
  setup(props, context) {
    let { msg } = toRefs(props);
    let { attrs, slots, emit } = context;
    console.log(props, context);
    let num = 10;
    return {
      num,
    };
    // 和setup,嵌套的生命周期
    // onMounted(() => {
    //   console.log("onMounted", num);
    // });
  },
  // 和setup,并列的生命周期
  mounted() {
    console.log("挂载后");
    console.log(this.$options);
  },
  data() {
    return {};
  },
  methods: {},
};
</script>

总结:

以上就是 vue3 中 setup 的作用。

知识点扩展:

Vue3中setup函数的作用与实现

  • setup函数是vue3新增组件选项,其作用为

  • 配合组合式api,建立组合逻辑、创建响应式数据、创建通用函数,注册生命周期钩子的能力
  • setup函数只会在被挂载时执行
  • setup返回值有两种
  • 函数
  • 对象
  • 若为对象,则将对象包含的数据暴漏给模板使用
  • 在渲染组件的函数中从组件上取出setup,获取其执行的返回值,判断其是否为函数,并将其挂载到组件实例上
  • 若为函数,则赋值给instance.render
  • 若为对象,则将其变成响应式,并赋值给instance.setupState
export function setupComponent(instance){
    let { type,props,children}  = instance.vnode
    let {data,render,setup} = type
    //初始化属性
    initProps(instance,props);
    instance.proxy = new Proxy(instance,instanceProxy);
    if(data){
        if(!isFunction(data)){
            return console.warn('The data option must be a function.')
        }
        //给实例赋予data属性
        instance.data = reactive(data.call({}))
    }
    if(setup){
      //setup的第二个参数,包含emit,attrs,slots等
      const context = {}
      const setupResult = setup(instance.props,context)
      if(isFunction(setupResult)){
        instance.render = setupResult
      }else if(isObject(setupResult)){
        instance.setupState = proxyRefs(setupResult)
      }
    }
    if(!instance.render){
      if(render){
      instance.render = render

      }else {
        //模板编译
      }
    } 
}

同时,instance的数据代理上做出对setupState的监听

const instanceProxy = {
    get(target,key){
        const { data,props,setupState} = target
        if(data && hasOwn(data,key)){
            return data[key]
        }else if(setupState && hasOwn(setupState,key)){
          return setupState[key]
        }
        else if(props && hasOwn(props,key)){
            return props[key]
        }
        let getter = publicProperties[key]
        if(getter){
            return getter(target)
        }
    },
    set(target,key,value,receiver){
        // debugger
        const {data,props,setupState} = target
        if(data && hasOwn(data,key)){
            data[key] = value
        }else if( setupState && hasOwn(setupState,key)){
            setupState[key]  = value
        }
        else if(props && hasOwn(props,key)){
            console.warn('props not update');
            return false
        }
        return true
    }
}

到此这篇关于Vue3 setup 的作用的文章就介绍到这了,更多相关Vue3 setup 的作用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解vue-cli 脚手架 安装

    详解vue-cli 脚手架 安装

    这篇文章主要介绍了vue-cli脚手架安装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue使用axios导出后台返回的文件流为excel表格详解

    vue使用axios导出后台返回的文件流为excel表格详解

    这篇文章主要介绍了vue使用axios导出后台返回的文件流为excel表格方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue3使用Element-plus的el-pagination分页组件时无法显示中文

    vue3使用Element-plus的el-pagination分页组件时无法显示中文

    本文主要介绍了vue3使用Element-plus的el-pagination分页组件时无法显示中文,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • elementUI表格多选框this.$refs.xxx.toggleRowSelection无效问题

    elementUI表格多选框this.$refs.xxx.toggleRowSelection无效问题

    这篇文章主要介绍了elementUI表格多选框this.$refs.xxx.toggleRowSelection无效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • vue-router子路由的实现方式

    vue-router子路由的实现方式

    这篇文章主要介绍了vue-router子路由的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • vue 动态修改a标签的样式的方法

    vue 动态修改a标签的样式的方法

    这篇文章主要介绍了vue 动态修改a标签的样式的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Vue利用computed解决单项数据流的问题

    Vue利用computed解决单项数据流的问题

    Vue是一个非常流行和强大的前端框架,它让我们可以用简洁和优雅的方式来构建用户界面,但是,Vue也有一些需要注意和掌握的细节和技巧,今天我们来分享一个Vue中非常经典的问题,也是一个非常实用的技巧,Vue利用computed解决单项数据流,需要的朋友可以参考下
    2023-08-08
  • Vue.js实现简单ToDoList 前期准备(一)

    Vue.js实现简单ToDoList 前期准备(一)

    这篇文章主要介绍了Vue.js实现简单ToDoList的前期准备,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • vuejs简单验证码功能完整示例

    vuejs简单验证码功能完整示例

    这篇文章主要介绍了vuejs简单验证码功能,结合完整实例形式分析了vue.js验证码的生成、显示、校验等相关操作技巧,需要的朋友可以参考下
    2019-01-01
  • 使用vue3指令封装一个图片预览功能

    使用vue3指令封装一个图片预览功能

    这篇文章主要为大家详细介绍了如何使用 vue3 指令封装一个后台管理系统图片预览功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01

最新评论