vue3 setup语法糖

0. 路由跳转

a.vue

<script setup>
    //引入路由
    import { useRouter } from 'vue-router'
    // 定义路由
    const router = useRouter()
    // 编辑
    let editBtn = (info) => {
          router.push({
          path:'/detail.vue', 
            query:{
                name: info
            }
         })
    }
</script>

detail.vue

<script setup>
import { reactive, ref, onMounted } from "vue";
//引入路由
import { useRoute } from 'vue-router'
// 定义路由
const route = useRoute()
let title = ref('')
onMounted(()=>{
    title.value = route.query.name
})
</script>

<template>
    <div>ddd
        <div>{{title}}</div>
    </div>
</template>

1. watch监听  

  watchEffect

import {ref,reactive, watchEffect } from 'vue'

watchEffect(()=>{ console.log('watch', activeTitle.value) })

  watch

// 参数一:getter函数返回值name发生变化时,会执行对应的回调函数
const obj = reactive({ name: 0 })
watch(
    () => obj.name,
    (newVal, oldVal) => {console.log(newVal, oldVal)},
    {
        deep: true, // 开启深度监听
        immediate: true // 值如果是true会打开首次监听
    }
)

 

//监听ref
let name = ref('')
watch(name, (newVal,oldVal)=>{console.log(newVal)})

2. computed计算属性

<div>{{computedValue}}</div>

import {ref,reactive, computed } from 'vue'
const computedValue = computed(()=> {
      return '计算属性'
});

3. await数据获取

let tableData = reactive([])
let getList = async ()=>{
      let data = await getTag({type: "ai"}).then(res=>res.data)
      tableData.push(...data)   //vue3使用proxy数组和对象不可以直接赋值
}
onMounted (async() => { 
      getList()
});

4. 组间传参

  父组件

<script setup>
import { reactive, ref, onMounted } from "vue";
//引入路由
import { useRoute } from 'vue-router'
// 定义路由
const route = useRoute()

let title = ref('')
let parValue = ref('')

let getReverse = (val)=>{
    parValue.value = val
}

// 调用子组件方法
const tab1Dom = ref()  //tab1Dom是定义子组件ref后的值
const parReverse = ()=>{
    tab1Dom.value.reversal()
}
onMounted(()=>{
    title.value = route.query.name
})
</script>

<template>
    <div class="detialPage">
        <h3>{{title}}</h3>
        <div class="">
            <el-input v-model="parValue" style="width:250px;" placeholder="Please input" />
            <el-button @click="parReverse" class="reBtn">sub反转事件</el-button>
        </div>
        <tab1 ref="tab1Dom" :parValue="parValue" @reverseVal="getReverse"></tab1>
    </div>
</template>

  子组件

     全局编译器宏只能在 script-setup 模式下使用,script-setup 模式一共提供了 4 个宏,包括: defineProps、defineEmits、defineExpose、withDefaults

<script setup>
import {ref, defineProps} from 'vue'
let props = defineProps({
      parValue:{
            type: String,
      }
})
let emits = defineEmits(['reverseVal'])

let reversal = ()=>{
      // 获取父组件传来的值,进行反转再传递给父组件
      let newVal = props.parValue.split('').reverse().join('')
      emits('reverseVal', newVal)
}
// 父组件调用子组件的方法,子组件需要先暴露出该方法
defineExpose({
      reversal,
      name
})
</script>
<template>
      <div class="subCon">
            <div>
                  {{props.parValue}}
                  <el-button @click="reversal" class="reBtn">反转</el-button>
            </div>
      </div>
</template>

 5. vuex持久化存储

npm i vuex-persistedstate

main.js

import store from './store/index'
const app = createApp(App)
app.use(router)
app.use(store)
app.mount('#app')

index.js

import { createStore } from 'vuex'
import createPersistedstate from 'vuex-persistedstate'
export default createStore({
    state () {
        return {
            darkStatus: false
        }
    },
    mutations: {
        setDark (state, data) {
            state.darkStatus = data
        }
    },
    modules: {
    },
    plugins: [
        // veux持久化配置
        createPersistedstate({
            key: 'darkStatus',
        })
    ]
    
})

head.vue

import { useStore } from "vuex"
const store = useStore()
const getSwitch = (data)=>{
      store.commit("setDark", data)
}

 

posted @ 2022-04-01 10:27  番茄西红柿u  阅读(739)  评论(0)    收藏  举报