vue3 写法小技巧

2024-09-11 13:41:07 浏览数 (1)

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

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

引用之前的写法

代码语言:javascript复制
<script lang="ts" />
    export default {
        name: 'User'
    }
<script>
<script lang="ts" setup>
    let name = 'iwhao'
</script>

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

代码语言:javascript复制
npm i vite-plugin-vue-setup-extend

vite.config.ts中引入

代码语言:javascript复制
import vueSetupExtend from 'vite-plugin-vue-setup-extend'

plugins: [
    vueSetupExtend()
]

引入之后的写法,看起来是不是很简洁

代码语言:javascript复制
<script lang="ts" setup name="User">
    let name = 'iwhao'
</script>

补充: 新版本的vue3 已经支持宏定义了

defineOptions

代码语言:javascript复制
<script setup>
defineOptions({
    name:'User'
    inheritAttrs: false,
    customOptions: {
    /* ... */
    }
})
</script>

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

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

ref和reactive的使用技巧

特点

ref 也能定义对象,但写起来麻烦 更改值还得写 .value,不敢想象 如果深层次结构将会是 .value噩梦 所以建议 浅层推荐ref,深层次使用reactive;

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

有解决方案

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

代码语言:javascript复制
<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 解构后的变量 也会失去响应式

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

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

然后 toRef

代码语言:javascript复制
<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>

0 人点赞