vue3 新语法 setup

本文详细介绍了 Vue3 中 setup 的使用方法,包括 ref 和 reactive 的应用、props 的正确处理方式、生命周期钩子 onMounted 的使用、getCurrentInstance 的介绍、watch 和 computed 的新特性、provide 和 inject 的用法、路由的监听与操作以及 Vuex store 的集成。
摘要由CSDN通过智能技术生成

相信大家都已经很熟悉vue3的新特性,简单记录一下vue3中setup的一些语法

下一篇将记录script中的setup语法糖解脱return     script中的setup语法糖

1. setup  ref  reactive  ref

<template>
 <div class="page">
   {{a}}
   {{b.name}}
 </div>
</template>

<script lang="ts">
import { ref,reactive,defineComponent } from 'vue'
export default defineComponent({
  setup() {
    let a = ref(0)
    let b = reactive({name:'xiaoming'})
    console.log(a.value);
    console.log(b.name);
    
    
    return {
      a,b
    }
  },
})
</script>

2. 组件props,attrs,slot,结构赋值时避免props失去响应性使用toRefs 

// 父组件
<template>
  <div class="page">
    <TableList/>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import TableList from '../../components/common/TableList.vue';
export default defineComponent({
  components: { TableList },
  setup() {
  },
})
</script>


// 子组件
<template>
  <div class="page">
    
  </div>
</template>

<script lang="ts">
import { defineComponent,toRefs } from 'vue'
export default defineComponent({
  emits:['close'],
  props: {
    tableData: { type: Array, required: false},
  },
  setup(props,ctx) {
    let { tableData } = toRefs(props)

    console.log(ctx); // attrs  emit  slots
    
    return {
      tableData
    }
  },
})
</script>

3. 生命周期 因为setup执行在created后,所以可以在setup里面写onMounted

<script lang="ts">
import { defineComponent,onMounted } from 'vue'
export default defineComponent({
  beforeCreate(){
    console.log('----------beforeCreate');
  },
  created(){
    console.log('----------created');
  },
  setup() {
    onMounted(() => {
      console.log('----------onMounted');
    })
  },
  mounted(){
    console.log('----------mounted');
  }

  // ----------beforeCreate
  // ----------created
  // ----------onMounted
  // ----------mounted
})
</script>

4. setup中不存在this,所以官方放出getCurrentInstance获取一些全局变量

<script lang="ts">
import { defineComponent,getCurrentInstance } from 'vue'
export default defineComponent({
  setup() {
    let { proxy } = getCurrentInstance() as any
    console.log(proxy);
    
  },
})
</script>

5. watch watchEffect unwatch  computed 

<script lang="ts">
import { defineComponent, watch,ref,watchEffect,computed } from 'vue'
export default defineComponent({
  setup() {
    let num = ref(0)
    let firstName = ref(0)
    let lastName = ref(0)

    watch(num, (newValue, oldValue) => {
      console.log('--------------' + num.value)
    })

    const unwatch =  watch([firstName, lastName], (newValues, prevValues) => {
      console.log(newValues, prevValues)
    },
    { deep: true,immediate:true })
    unwatch() // 取消监听

    // watchEffect:不需要手动传入依赖,每次初始化时会执行一次回调函数来自动获取依赖,无法获取到原值,只能得到变化后的值
    watchEffect(() => {
      console.log(num.value)
    }, 
    {
      flush: 'post' // 确保模板引用与 DOM 保持同步"pre" | "post" | "sync" post(默认),sync表示在状态更新时同步调用,pre则表示在组件更新之前调用
    })

    
    const num2 = computed(() => num.value + 1)
    const num3  = computed({
      get() {
        return 1;
      },
      set(value) {
        console.log(value);
      },
    });
    return {
      num,firstName,lastName,num2,num3
    }
  },
})
</script>

6. provide inject

<script lang="ts">
import { defineComponent, provide, inject } from 'vue'
export default defineComponent({
  setup() {
    provide('num', 1)
    const userGeolocation = inject('num')
  },
})
</script>

7. router

import { useRouter,useRoute } from 'vue-router'
const route = useRoute()
const router = useRouter()
router.push('/PageIndex')
router.push({path:'/PageIndex',query:{id:1}}) 
// 获取参数 
console.log(route.query.id)
// 监听路由
watch(() => route, (newV, oldV) => {
  console.log(newV, oldV);
},
{ deep: true })

8. store

<script lang="ts">
import { defineComponent } from 'vue'
import { useStore } from "vuex"
export default defineComponent({
  setup() {
    const store = useStore()
    const userName = store.state.userName

    console.log(store); // state commit dispatch getters和vue2同样使用
  },
})
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值