vue3.2 setup 语法糖汇总

480 阅读1分钟

在Vue3.0中变量必须return 出来,template中才能使用;而在Vue3.2中只需要在 script 标签上加上 setup 属性,无需 return ,template 便可以直接使用

1、如果使用setup语法糖

代码如下(示例):

<template><template/>
<script setup></script>
<style scoped lang="less"></style>

2、data数据的使用

由于 setup 不需要 return,所以直接声明数据即可 代码如下(示例):

<template></template>
<script setup>
  import { ref, reactive, toRefs } from 'vue'
  const data = reactive({
    debuVisible: false,
    name: '小明',
    age: 22
  })
  const content = ref('content')
  const { debuVisible, name, age } = toRefs(data)
</script>

3、method方法的使用

代码如下(示例):

<template>
  <button @click="onClickHelp">帮助</button>
</template>
<script setup>
  import {reactive} from 'vue'
  const data = reactive({
    aboutExeVisible: false,
  })
  const onClickHelp = () => {
    console.log('帮助')
    data.aboutExeVisible = true
  }
</script>

4、watchEffect的使用

代码如下(示例):

<template></template>
<script setup>
  import { ref, watchEffect } from 'vue'
  let sum = ref(0)
  watchEffect(()=>{
    const x1 = sum.value
    console.log('watchEffect所指定的回调执行了')
  })
</script>

5、watch的使用

代码如下(示例):

<template></template>
<script setup>
  import { reactive, watch } from 'vue'
  let sum = ref(0)
  let msg = ref('hello')
  let person = reactive({
    name: '小明',
    age: 15,
    job: {
      j1: {
        salary:20
      }
    }
  })
  //两种监听格式
  watch([sum,msg],(newValue,oldValue) => {
    console.log('sum或msg变了',newValue,oldValue)
  },{immediate: true})
  
  watch(() => person.job,(newValue,oldValue) => {
    console.log('person的job变化了',newValue,oldValue)
  },{deep: true})
</script>

6、computed计算属性的使用

computed计算属性有两种写法,代码如下(示例):

<template><template>
<script setup>
  import { reactive, computed } from 'vue'
  let data = reactive({
    firstName: '鲨鱼',
    lastName: '辣椒',
  })
  //计算属性简写
  const fullName = computed(() => {
    return data.firsName + '-' + data.lastName
  })
  //完整写法
  const fullName = computed({
    get() {
      return data.firstName + '-' + data.lastName
    }
    set(value) {
      const nameArr = value.split('-')
      data.firstName = nameArr[0]
      data.lastName = nameArr[1]
    }
  })
</script>

7、props父子传值的使用

子组件代码如下(示例):
<template>
  <div>{{props.name}}</div>
</template>
<script setup>
  import { defineProps } from 'vue'
  const props = defineProps({
    name: {
      type: String,
      default: '11'
    }
  })
  //或者
  //const props = defineProps(['name'])
</script>
-----------------------------------------------
父组件代码如下(示例):
<template>
  <Child :name='name'/>
</template>
<script setup>
  import { ref } from 'vue'
  import Child from './Child.vue'
  let name = ref('鲨鱼辣椒')
</script>

8、emit子传父值的使用

子组件代码如下(示例):
<template>
  <button @click="isOK"></button>
</template>
<script setup>
  import { defineEmits } from 'vue';
  //emit
  const emit = defineEmits(['setResult'])
  const isOk = () => {
    emit('setResult');
  }
</script>
--------------------------------------------
父组件代码如下(示例):
<template>
  <Child @setResult="setResult">
</template>
<script setup>
  import Child from './Child'
  import { reactive } from 'vue'
  const data = reactive({
    aboutVisible: false,
  })
  const setResult = () => {
    data.aboutVisible = true
  }
</script>

9、获取子组件ref变量和defineExpose暴露

vue2中的获取子组件的ref, 直接在父组件中控制子组件方法和变量的方法

子组件代码如下(示例):
<template>
  <div>{{data}}</div>
</template>
<script setup>
  import { reactive, toRefs } from 'vue'
  const data = reactive({
    modelVisible: false,
    historyVisible: false,
    reportVisible: false,
  })
  defineExpose({
    ...toRefs(data)
  })
</script>
-----------------------------------------------
父组件代码如下(示例):
<template>
  <button @click="onClickSetup">点击</button>
  <Child ref="content">
</template>
<script setup>
  import { ref } from 'vue'
  const content = ref('content')
  const onClickSetUp = () => {
    content.value.modelVisible = true
  }
</script>

10、路由useRoute和useRouter的使用

代码如下(示例):

<template></template>
<script setup>
  import { useRoute, useRouter } from 'vue-router'
  
  //声明
  const route = useRoute()
  const router = useRouter()
  //获取query
  console.log(route.query)
  //获取params
  console.log(route.params)
  //路由跳转
  router.push({
    path: '/index'
  })
</script>

11、store仓库的使用

代码如下(示例):

<template></template>
<script setup>
  import { useStore } from 'vuex'
  import { num } from '../store/index'
  
  const store = useStore(num)
  //获取Vuex的state
  console.log(stote.state.number)
  //获取Vuex的getters
  console.log(stote.state.getNumber)
  //提交mutations
  store.commit('fnName')
  //分发actions的方法
  store.dispatch('fnName')
</script>

12、await的支持

setup 语法糖中可以直接使用 await,不需要写 async,setup会自动变成 async setup 代码如下(示例):

<template></tamplate>
<script setup>
  import api from '../api/Api'
  const data = await Api.getData()
  console.log(data)
</script>

13、provide 和inject祖孙传值

父组件代码如下(示例):
<template>
  <Save />
</template>
<script setup>
  import { ref,provide } from 'vue'
  import Save from '@components/Save'
  
  let name = ref('Jerry')
  //使用provide
  provide('provideState', {
    name,
    changeName: () => {
      name.value = '鲨鱼辣椒'
    }
  })
</script>
---------------------------------------------------
子组件代码如下(示例):
<template></template>
<script setup>
  import { inject } from 'vue'
  const provideState = inject('provideState')
  
  provideState.changeName()
</script>