首页 > 其他分享 >vue3新语法糖——setup script

vue3新语法糖——setup script

时间:2023-08-18 15:44:43浏览次数:38  
标签:vue const script setup Child vue3 组件

vue3新语法糖——setup script

CoCoyY1 2021-03-27 12:5241480  

前言

vue3上线已经很久了,许多小伙伴应该都已经使用过vue3了。那么在使用vue3composition API的时候有没有觉得整个过程会比较繁琐呢。比如当你定义了一个方法,然后发现模板需要使用该方法,然后就必须将方法返回。当一个组件中存在大量方法和属性的时候,这个过程就会非常的难受。

什么是setup script

setup script就是vue3新出的一个语法糖,使用方法就是在书写script标签的时候在其后面加上一个setup修饰。

  js 复制代码
<script setup></script>

看上去是不是很简单呢?

vue3 + ts + setup script + volar最佳实践(在ts中使用setup script看这篇)

image.png

setup script有什么用

看到这里很多小伙伴就不理解了,我在script后面加上一个setup有什么用呢?接着看!

1> 自动注册子组件

什么意思?

现在有两个组件,父组件Father.vue,子组件Child.vue。

vue3语法

  js 复制代码
<template>
  <div>
    <h2>我是父组件!</h2>
    <Child />
  </div>
</template>

<script>
import { defineComponent, ref } from 'vue';
import Child from './Child.vue'

export default defineComponent({
  components: {
      Child
  },
  setup() {

    return {
      
    }
  }
});
</script>

image.png

vue3语法在引入Child组件后,需要在components中注册对应的组件才可使用。

setup script写法

  js 复制代码
<template>
  <div>
    <h2>我是父组件!-setup script</h2>
    <Child />
  </div>
</template>

<script setup>
import Child from './Child.vue'

</script>

image.png

这么一对比是不是就非常明了了呢?直接省略了子组件注册的过程。

2> 属性和方法无需返回

重点来了,之前说composition API写起来有点繁琐的原因在于需要手动返回模板需要使用的属性和方法。而在setup script中可以省略这一步。看看下面的例子。

setup.gif

vue3语法

  js 复制代码
<template>
  <div>
    <h2 @click="ageInc">{{ name }} is {{ age }}</h2>
  </div>
</template>

<script>
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const name = ref('CoCoyY1')
    const age = ref(18)

    const ageInc = () => {
      age.value++
    }

    return {
      name,
      age,

      ageInc
    }
  }
})
</script>

setup script写法

  js 复制代码
<template>
  <div>
    <h2 @click="ageInc">{{ name }} is {{ age }}</h2>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const name = ref('CoCoyY1')
const age = ref(18)

const ageInc = () => {
  age.value++
}

</script>

哇哦,是不是非常方便呢?

3> 支持props、emit和context

看到这里可能有小伙伴会问,没了setup()那怎么获取到props和context呢?来!

vue3语法

  js 复制代码
//Father.vue
<template>
  <div >
    <h2 >我是父组件!</h2>
    <Child msg="hello" @child-click="childCtx" />
  </div>
</template>

<script>
import { defineComponent, ref } from 'vue';
import Child from './Child.vue';

export default defineComponent({
  components: {
    Child
  },
  setup(props, context) {
    const childCtx = (ctx) => {
      console.log(ctx);
    }

    return {
      childCtx
    }
  }
})
</script>


//Child.vue
<template>
  <span @click="handleClick">我是子组件! -- msg: {{ props.msg }}</span>
</template>

<script>
import { defineComponent, ref } from 'vue'

export default defineComponent({
  emits: [
    'child-click'
  ],
  props: {
    msg: String
  },
  setup(props, context) {
    const handleClick = () => {
      context.emit('child-click', context)
    }

    return {
      props,
      handleClick
    }
  },
})
</script>

image.png

点击一下子组件看看打印了什么。

image.png

很明显是成功的打印出了context,这是vue3的语法。

setup script写法

  js 复制代码
//Father.vue
<template>
  <div >
    <h2 >我是父组件!</h2>
    <Child msg="hello" @child-click="childCtx" />
  </div>
</template>

<script setup>
import Child from './Child.vue';

const childCtx = (ctx) => {
  console.log(ctx);
}
</script>


//Child.vue
<template>
  <span @click="handleClick">我是子组件! -- msg: {{ props.msg }}</span>
</template>

<script setup>
import { useContext, defineProps, defineEmit } from 'vue'

const emit = defineEmit(['child-click'])
const ctx = useContext()
const props = defineProps({
  msg: String
})

const handleClick = () => {
  emit('child-click', ctx)
}
</script>

image.png

点击子组件看看使用语法糖时context能不能正确打印。

image.png

这里可以看到context被打印了出来,其中的attrs、emit、props、slots、expose属性和方法依然可以使用。

那就对了,setup script语法糖提供了三个新的API来供我们使用:definePropsdefineEmituseContext

其中defineProps用来接收父组件传来的值props。defineEmit用来声明触发的事件表。useContext用来获取组件上下文context。

对比一下两种写法,是不是setup script更加简洁方便呢?

但是!!!

注意我引入三个API的顺序,在此时如果把useContext放在最后引入,那么....

image.png

报错!!!

这应该是一个bug吧,想不出其他解释了。

以上就是vue3新出的语法糖setup script的基本使用方法了,是不是很香呢?笔者认为这个语法糖应该会成为一个正式的内容,因为它真的可以说是非常方便简洁了。

写在最后 (^.^)

如果觉得我写的还不错的话,可以赏我个点赞哦^.^

如果有写错的地方、写的不好的地方也请大家指出,供我纠正。

我是CoCoyY1,一个记录自己学习的前端热爱者。

标签:vue,const,script,setup,Child,vue3,组件
From: https://www.cnblogs.com/mouseleo/p/17640687.html

相关文章

  • [转]如何在 JavaScript 中遍历对象
    原文地址:如何在JavaScript中遍历对象在JavaScript中,当你听到“循环”一词时,你可能会想到使用各种循环方法,例如 for 循环、forEach() 方法、map() 方法等等。但不幸的是,这些方法对于对象不起作用,因为对象是不可迭代的。这并不意味着我们不能循环遍历一个对象——只是我......
  • Script Lab
    $("#setup").click(()=>tryCatch(setup));$("#add-row").click(()=>tryCatch(addRow));$("#add-column").click(()=>tryCatch(addColumn));$("#add-calculated-column").click(()=>tryCatch(addCalculatedCo......
  • TypeScript学习
    TypeScript快速入门JavaScript是一种属于网络的高级脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美欢的浏览效果。TypeScript是JavaScript的一个超集,它扩展了JavaScript的语法通过在JavaScript的基础上添加静态类型定义......
  • 2 JavaScript的基础类型
    2JavaScript的基础类型JS虽然是一个脚本语言.麻雀虽小,五脏俱全.在js中也是可以像其他编程语言一样.声明变量,条件判断,流程控制等等.我们先看一下JS中的数据类型在js中主要有这么几种数据类型(基本)number数字,不论是整数还是小数,数据类型都是numberstring字......
  • 谈谈Vue3中的ref和reactive
    一、是什么?ref和reactive是Vue3中用来实现数据响应式的API一般情况下,ref定义基本数据类型,reactive定义引用数据类型(我喜欢用它来定义对象,不用它定义数组,原因后面讲)我理解的ref本质上是reactive的再封装二、先聊reactivereactive定义引用数据类型(以对象和数组举例),它能够将复......
  • vue3项目,vie框架,相对路径图片,测试时正常显示,发布后不显示问题解决方案
    参考Vite官网的说明,修改图片的引用路径后,图片发布后可以正常显示constimgUrl=newURL('./img.png',import.meta.url).hrefdocument.getElementById('hero-img').src=imgUrl官网地址: https://cn.vitejs.dev/guide/assets.html ......
  • setup.py可以打包的格式
    pythonsetup.py使用setuptools或distutils提供了多种打包、构建和安装Python项目的命令。以下是其中的一些常用命令:sdist(SourceDistribution)创建一个源代码分发。通常,它包括一个tarball,其中包含项目的源代码、setup.py脚本、README文件以及其他必要的文件。b......
  • QtWebChannel和JavaScript进行通信(简单理解)
    说明在使用Qt(C++)和JavaScript之间实现通信时,通常会使用一些模块和技术来使两者能够交互和传递数据。这种通信通常用于在Qt应用程序中嵌入Web内容,或者在Web页面中嵌入Qt应用程序。以下是一些常用的模块和技术,以及它们的作用QtWebEngine模块:作用:QtWebEngine是Qt中的Web引擎,允......
  • JavaScript-数据类型
    JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型,共有六种。(ES6又新增了Symbol和BigInt数据类型,本教程不涉及。)数值(number):整数和小数(比如1和3.14)。字符串(string):文本(比如HelloWorld)。布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)。undefined:表......
  • 【软硬件环境与工具使用】setuptools模块
    前言  1)setuptools之setup函数参数详解BuildingandDistributingPackageswithSetuptools-setuptools68.0.0.post20230808documentationPython库打包分发(setup.py编写)简易指南|Huoty'sBlogsetup.py实现C++扩展和python库编译_pythonsetup.py编译_ming7771......