vue3中setup-script的应用实例

目录
  • 新特性的产生背景
  • 内部变量
  • 子父级传值
  • 总结

新特性的产生背景

在了解它怎么用之前,可以先了解一下它被推出的一些背景,可以帮助你对比开发体验上的异同点,以及了解为什么会有这一章节里面的新东西。

在 Vue 3.0 的 .vue 组件里,遵循 SFC 规范要求(注:SFC,即 Single-File Component,.vue 单组件),标准的 setup 用法是,在 setup 里面定义的数据如果需要在 template 使用,都需要 return 出来。

如果你使用的是 TypeScript ,还需要借助 defineComponent 来帮助你对类型的自动推导。

<!-- 标准组件格式 -->
<script lang="ts">
import { defineComponent } from 'vue'

export default defineComponent({
  setup () {
    // ...

    return {
      // ...
    }
  }
})
</script>

关于标准 setup 和 defineComponent 的说明和用法,可以查阅 全新的 setup 函数 一节。

script-setup 的推出是为了让熟悉 3.0 的用户可以更高效率的开发组件,减少一些心智负担,只需要给 script 标签添加一个 setup 属性,那么整个 script 就直接会变成 setup 函数,所有顶级变量、函数,均会自动暴露给模板使用(无需再一个个 return 了)。

上次写了关于自己初次使用vue3的一些感受,同时也获取了一众大佬的教导,其中最重要的是方法的setup的语法糖,为了搞清楚这个语法糖,我自己有把之前的页面,又重新重构了一次。果然得到真香定律,使用以后发现原来vue3还可以像react那样简洁的处理方法和传值,话不多说上代码看下吧

内部变量

首先看下内部变量变化,这是单纯之前使用setup

    <template>
    <div>
       <div>
            子组件内String:{{infor}}
       </div>
        <div>
            子组件内obj:{{obj.data}}
        </div>
        <div>
            子组件内arry:{{arry[0]}}
        </div>
        <div @click="changeInfor">
            改变obj
        </div>
    </div>

</template>

<script>
    import { ref, onMounted, defineEmits, defineProps, defineExpose, reactive } from "vue";
    export default {
        setup(){
             const infor = ref('infor')
             const obj  = reactive({
                data:'obj'
            })
            const arry  = reactive([111,222,333])
            const changeInfor  = () =>{
                obj.data = 'changeObj'
            }

            return {
                infor, obj, arry, changeInfor
            }
        }
    }
</script>

<style>
  div{
      line-height: 40px;
  }
</style>

这是改成语法糖之后的代码

    <template>
    <div>
       <div>
            子组件内String:{{infor}}
       </div>
        <div>
            子组件内obj:{{obj.data}}
        </div>
        <div>
            子组件内arry:{{arry[0]}}
        </div>
        <div @click="changeInfor">
            改变obj
        </div>
    </div>

</template>

<script setup>
      import { ref, onMounted, defineEmits, defineProps, defineExpose, reactive } from "vue";
      const infor = ref('infor')
      const obj  = reactive({
          data:'obj'
      })
      const arry  = reactive([111,222,333])
      const changeInfor  = () =>{
          infor.value = '32323'
          obj.data = 'changeObj'
      }
</script>

<style>
  div{
      line-height: 40px;
  }
</style>

这里可以明显看出来,未使用setup-script的方式,跟传统的还是有很大区别的, 结构简单明了,不需要把大量的变量和方法都写在setup这个函数里面,自由度很高,有点像react的类里面的使用方法

子父级传值

这里面主要涉及到三个方法 defineEmits,defineProps,defineExpose

// 父组件
<template>
    <div>
        父组件
        <children ref="child" @getData="sentData" :data="data"/>
        <div>{{childData || '我还没收到值'}}</div>
        <div @click="makeClid">点击调用子组件方法</div>
    </div>
</template>
<script setup>
  import { ref, onMounted, defineEmits, defineProps, defineExpose, reactive } from "vue";
  import children from './components/children.vue'
  const childData = ref('')
  const data = ref('父组件给的值prop传值')
  const sentData = (data) =>{
    childData.value = data
  }
  const child = ref(null) // 获取子组件ref
  const makeClid = () =>{
    child.value.setData('子组件已调用')
  }
</script>

// 子组件
<template>
    <div>
       {{fatherData || '父组件还未调用我'}}
       <div @click="getData">触发父组件</div>
       <div>fatherProps:{{fatherProps}}</div>
    </div>

</template>

<script setup>
      import { ref, onMounted, defineEmits, defineProps, defineExpose, reactive } from "vue";
      const fatherData = ref('')
      const fatherProps = ref('')
      const props = defineProps({ // 父组件传值
          data:String
      })
        fatherProps.value = props.data
      const emit = defineEmits(['getData']) // 接受父组件数据
      const getData = () =>{
          emit('getData','给父组件的值')  // 触发父组件的方法
      }

      const setData = (val) =>{ // 父组件调用
          fatherData.value = val
      }

      defineExpose({  // 抛出方法
            getData,
            setData
        })
</script>
  • 子组件调用父组件:这点很好理解,跟vue2差不多的形式,父组件里面挂载@getData,子组件里面通过defineEmits这个方法获取,最后调用方式跟之前也是一样的
  • 父组件调用子组件:这点区别还是很大的,需要子组件先定义好方法,然后通过defineExpose暴露出去,父组件创建ref,这里需要创建的变量名字和子组件的ref名字一直,否者获取不到,最后通过获取抛出的value找到对应的方法。

总结

到此这篇关于vue3中setup-script应用的文章就介绍到这了,更多相关vue3 setup-script应用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue3基于script setup语法$refs的使用

    目录 一.vue2语法 二.vue3使用 1. 组件设置ref值 2. 组件实例获取 3. 子组件内设置对外公开的变量 一.vue2语法 vue2语法在组件上设置ref属性后,在代码里可以通过 this.$refs.ref值 访问到对应的子组件. 一个设置ref值的组件: <base-input ref="usernameInput"></base-input> 在js代码中可以通过如下代码访问到这个组件: this.$refs.usernameInput 可以

  • Vue3+script setup+ts+Vite+Volar搭建项目

    目录 使用 Vite 创建 vue + ts 项目 Vue 3 的三种语法 Option API Composition API script setup(Composition API 的语法糖) 安装 Volar 结尾 好久没有写了,最近看到Vue3.2 发布了,害,又要开始卷了么. 其实我自己本身还没有使用过Vue3 做过实际的项目开发,然鹅又出新东西了--, 新时代农民工真的是左手工作,右手游戏,还要用jio去学习呢. 什么? 你说谈对象? xswl,我特么一个农民工也配谈对象? 不卷不

  • vue3中setup语法糖下通用的分页插件实例详解

    目录 vue3中setup语法糖下父子组件之间的通信 准备工作 父传子: 子传父: 先给大家介绍下vue3中setup语法糖下通用的分页插件,内容如下所示: 效果 自定义分页插件:PagePlugin.vue <script setup lang="ts"> // total :用来传递数据总条数 // pageSize :每页展示几条数据 // currentPage :当前默认页码 // change-page :页码改变时触发的事件,参数为当前页码 const pro

  • Vue3中SetUp函数的参数props、context详解

    1.setUp函数的第1个参数props setup(props,context){} 第一个参数props: props是一个对象,包含父组件传递给子组件的所有数据. 在子组件中使用props进行接收. 包含配置声明并传入的所有的属性的对象 也就是说:如果你想通过props的方式输出父组件传递给子组件的值. 你需要使用props进行接收配置.即props:{......} 如果你未通过Props进行接受配置,则输出的值是undefined <template> <div class=&

  • Vue3中setup方法的用法详解

    目录 1.参数props 2.参数context 3. 子组件向父组件派发事件 4.优化事件派发 5.获取父组件传递的值 1.参数props props是一个对象,包含父组件传递给子组件的所有数据.在子组件中使用props进行接收.包含配置声明并传入的所有的属性的对象. 也就是说,如果你想通过props的方式输出父组件传递给子组件的值.你需要使用props进行接收配置.即props:{......}.如果你未通过Props进行接受配置,则输出的值是undefined <template> &l

  • vue中setup语法糖写法实例

    目录 变量声明 父传子 子传父 变量声明 变量声明定义的时候,不需要返回可以直接使用即可 没有使用setup语法糖时写法 <script> import {useStore} from 'vuex' export default { setup() { const store=useStore() const plus=()=>{ store.commit('plus') } return {plus} }, } </script> 使用setup语法糖写法 <scri

  • 详解vue3中setUp和reactive函数的用法

    1 setUp的执行时机 我们都知道,现在vue3是可以正常去使用methods的. 但是我们却不可以在setUp中去调用methods中的方法. 为什么了??? 我们先了解一下下面这两个生命周期函数,分别是: beforeCreate 表示data 中的数据还没有初始化,是不可以使用的 Created : data已经被初始化了,可以使用 setUp在beforeCreate 和 Created 这两个函数之间. 是不是就知道为啥setUp中不可以去调用methods中的方法了. 2.setU

  • vue3中的watch和watchEffect实例详解

    目录 首先总结一下两者的区别: 下面是根据上面的第三点做的一些小实验: 总结 闲来无事,比较了一下 vue3 中的 watch 和 watchEffect,总觉得官方文档没咋说清楚,今天就小小实践了一下. 首先总结一下两者的区别: 1.watch 是惰性执行,而 watchEffect 不是,不考虑 watch 的第三个参数配置的情况,watch 在组件第一次执行的时候是不会执行的,只有在之后依赖项变化的时候再执行,而 watchEffect 是在程序执行到此处的时候就立即执行,而后再响应其依赖

  • Vue3中v-if和v-for优先级实例详解

    目录 在vue2中应尽量避免二者同时使用 vue3中的改变 结论 补充:注意事项 总结 在vue2中应尽量避免二者同时使用 vue 2.x官方链接 当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级. 那么,我们举个例子说明为啥不推荐 <template> <div class="hello"> <div v-for="(item,index) in list" v-if="index ===

  • 详解Vue3中setup函数的使用教程

    目录 vue2 和 vue3 开发的区别 使用 setup 原因 setup 用法 setup 可以接受哪些参数 setup 详解 setup 函数自动执行 setup 函数定义变量 setup 创建方法 动态更新数据 vue2 和 vue3 开发的区别 首先,目前来说 vue3 发布已经有一段时间了,但是呢,由于还处于优化完善阶段,对于 vue3 开发项目的需求不是很高,主要还是以 vue2 开发为主,但是相信,vue3 进行项目开发是大势所趋. vue2 开发项目过程中,会存在代码冗余和结构

  • 关于vue3中setup函数的使用

    概述 一. 初识setup函数 组件中所用到的:数据.方法等等均要配置在setup中,这也就意味着在Vue2中写的data.methods在这里都不再推荐使用. 这样的配置让对象式编程趋近于了函数式编程. <script>export default { name: 'App', // 最为原始的对象写法是这样,但是通过es6我们可以简写 // setup: function(){} setup () { // 数据 let name = '黑猫几绛' let age = 20 // 方法 f

  • vue3.0中setup中异步转同步的实现

    目录 vue3 setup中异步转同步 vue3中setup前加上async后页面不显示 子组件 父组件中需要单独设置 使用vue3中的异步 vue3 setup中异步转同步 vue3中setup前加上async后页面不显示 **问题描述 **在开发 vue3 中,因为通过接口数据为异步函数获取,导致最后数据无法成功赋值进 return 中的数据.所以需要setup函数异步转同步,后设置了async 后异步转同步,结果导致页面空白不显示. 解决问题 在Vue3中,如果当前组件的setup使用了a

随机推荐