vue3 写法小技巧

1,468 阅读2分钟

vite-plugin-vue-setup-extend插件使用

作用合并组件name设置 和 setup 语法糖

引用之前的设置name的写法

<script lang="ts" />
    export default {
        name: 'User'
    }
<script>
<script lang="ts" setup>
    let name = 'iwhao'
</script>

看起来是不是很麻烦,还要写两个script标签,那有没有办法利用一个script标签来同时声明setup和name名称呢,当然有,vite-plugin-vue-setup-extend这个插件就可以做到,帮你省去了多余的东西

项目下载 vite-plugin-vue-setup-extend插件

    npm i vite-plugin-vue-setup-extend

vite.config.ts 中引入 vite-plugin-vue-setup-extend

    import vueSetupExtend from 'vite-plugin-vue-setup-extend'

    plugins: [
        vueSetupExtend()
    ]

因为修改了配置文件,所以需要重新运行项目命令

    npm run dev

引入之后的写法,看起来 简洁了很多,这才符合人体工程学写法

    <script lang="ts" setup name="User">
        let name = 'iwhao'
    </script>

补充: vue3 已经支持宏定义了defineOptions

defineOptions

<script setup>
defineOptions({
    name:'User'
    inheritAttrs: false,
    customOptions: {
    /* ... */
    }
})
</script>


defineOptions是一个宏定义,选项将会被提升到模块作用域中,无法访问 script setup 中不是字面常数的局部变量。

  • 字面常数:在编程中,字面常数指的是直接在代码中用字面值(如整数、字符串、布尔值等)表示的值,这些值在程序运行过程中不会改变。

ref和reactive的使用技巧

特点

ref 可以虽然持有任何类型的值,但如果是深层次的结果后,写起来会很麻烦 更改值还得写 .value,不敢想象 如果深层次结构将会是 .value噩梦, 所以建议 浅层推荐ref,深层次使用reactive;

但reactive有一定的使用局限性,例如reactive 重新分配一个新对象会失去响应式(应用场景 数据从接口获取,拿到后重新赋值)

错误的尝试: 以为重新套一层reactive就可以,但实际不会生效,想想也对

<template>
  <div>
    <h1>{{ man.name }}</h1>
    <h1>{{ man.age }}</h1>
    <button @click="change">改变</button>
  </div>
</template>

<script setup>
import { reactive, toRef, toRefs } from 'vue'

let man = reactive({
  age: 18,
  name: 'iwhao'
})

function change(){
  man = reactive({
    age: 20,
    name: 'iwhao2'
  })
}
</script>

正确的解决方案

其实可以利用Object.assign(a,b)去整体替换 b中的值替换掉a中的值 a是个 reactive对象

而且注意 reactive 解构后的变量 也会失去响应式

    let man = reactive({
      age: 18,
      name: 'iwhao'
    })
    // 这样写此age则是普通变量,非响应式 
    let {age} = man

可以利用 toRefs 进行解构多个变量且每个变量都是响应式,但这个变量和reactive中变量其实是一体的,看下面这个例子,改变man.name的值 name值也会跟着变


<template>
  <div>
    <h1>{{ man.name }}</h1>
    <h1>{{ man.age }}</h1>
    <h1>{{ name }}</h1>
    <h1>{{ age }}</h1>
    <button @click="change1">改变1</button>
    <button @click="change2">改变2</button>
  </div>
</template>

<script setup>
import { reactive, toRefs } from 'vue'

let man = reactive({
  age: 18,
  name: 'iwhao'
})

let {age, name} = toRefs(man)
function change1(){
  age.value = 30
  name.value = 'iwhao tai shuai'
}
function change2(){
  man.age = 20
  man.name = 'iwhao shuai'
}
</script>

2.gif

还有一个api toRef 从名称就可以看出来少了个s,可以创建一个对应的 ref,和toRefs有同样性质,当前值更新的化会与源属性同步。反之同理。

let man = reactive({
  age: 18,
  name: 'iwhao'
})

let age = toRef(man, 'age')