Vue响应性语法糖怎么配置

发布时间:2023-03-06 16:07:34 作者:iii
来源:亿速云 阅读:76

本篇内容主要讲解“Vue响应性语法糖怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue响应性语法糖怎么配置”吧!

介绍

自从引入组合式 API 的概念以来,一个主要的未解决的问题就是 refreactive 到底用哪个。reactive 存在解构丢失响应性的问题,而 ref 需要到处使用 .value 则感觉很繁琐,并且在没有类型系统的帮助时很容易漏掉 .value

例如,下面的计数器:

<template>
 <button @click="increment">{{ count }}</button>
</template>

使用 ref 定义 count 变量和 increment 方法:

let count = ref(0)

function increment() {
 count.value++
}

而使用响应性语法糖,我们可以像这样书写代码:

let count = $ref(0)

function increment() {
 count++
}
  1. Vue 的响应性语法糖是一个编译时的转换步骤,$ref() 方法是一个编译时的宏命令,它不是一个真实的、在运行时会调用的方法,而是用作 Vue 编译器的标记,表明最终的 count 变量需要是一个响应式变量

  2. 响应式的变量可以像普通变量那样被访问和重新赋值,但这些操作在编译后都会变为带 .valueref。所以上面例子中的代码也会被编译成使用 ref 定义的语法。

  3. 每一个会返回 ref 的响应式 API 都有一个相对应的、以 $ 为前缀的宏函数。包括以下这些 API:

  1. 可以使用 $() 宏来将现存的 ref 转换为响应式变量。

const a = ref(0)
let count = $(a)
count++
console.log(a.value) // 1
  1. 可以使用 $$() 宏来将任何对响应式变量的引用都会保留为对相应 ref 的引用。

let count = $ref(0)
console.log(isRef($$(count))) // true

$$() 也适用于已解构的 props,因为它们也是响应式的变量。编译器会高效地通过 toRef 来做转换:

const { count } = defineProps<{ count: number }>()
passAsRef($$(count))

配置

响应性语法糖是 组合式 API 特有的功能,且必须通过构建步骤使用。

  1. 必须,需要 @vitejs/plugin-vue@>=2.0.0,将应用于 SFC 和 js(x)/ts(x) 文件。

// vite.config.js
export default {
 plugins: [
   vue({
     reactivityTransform: true
   })
 ]
}

如果是 vue-cli 构建,需要 vue-loader@>=17.0.0,目前仅对 SFC 起效。

// vue.config.js
module.exports = {
 chainWebpack: (config) => {
   config.module
     .rule('vue')
     .use('vue-loader')
     .tap((options) => {
       return {
         ...options,
         reactivityTransform: true
       }
     })
 }
}

如果是 webpack + vue-loader 构建,需要 vue-loader@>=17.0.0,目前仅对 SFC 起效。

// webpack.config.js
module.exports = {
 module: {
   rules: [
     {
       test: /\.vue$/,
       loader: 'vue-loader',
       options: {
         reactivityTransform: true
       }
     }
   ]
 }
}
  1. 可选,tsconfig.json 文件中添加如下代码, 不然会报错 TS2304: Cannot find name '$ref'.,虽然不影响使用,但是会影响开发体验:

"compilerOptions":{ "types": ["vue/ref-macros"] }
  1. 可选,eslintrc.cjs 文件中添加如下代码,不然会提示 ESLint: '$ref' is not defined.(no-undef)

module.exports = { ...globals: {
   $ref: "readonly",
   $computed: "readonly",
   $shallowRef: "readonly",
   $customRef: "readonly",
   $toRef: "readonly",
 }
};
  1. 当启用响应性语法糖时,这些宏函数都是全局可用的、无需手动导入。也可以在 vue 文件中显式引入 vue/macros,这样就不用配置第二和第三步中的 tsconfig.jsoneslintrc 了。

import { $ref } from 'vue/macros'

let count = $ref(0)

已废弃的实验性功能

废弃原因

尤雨溪在2个星期前(2023 年 2 月 21 日上午 10:05 GMT+8),亲自给出了废弃的原因,翻译如下:

正如你们中的许多人已经知道的那样,我们在团队一致同意的情况下正式放弃了这个 RFC。

理由

Reactivity Transform 的最初目标是通过在处理反应状态时提供更简洁的语法来改善开发人员的体验。我们将其作为实验性产品发布,以收集来自现实世界使用情况的反馈。尽管提出了这些好处,我们还是发现了以下问题:

最重要的是,碎片化的潜在风险。尽管这是明确的选择加入,但一些用户对该提议表示强烈反对,原因是他们担心他们将不得不与不同的代码库一起工作,在这些代码库中,有些人选择了使用它,而有些人则没有。这是一个合理的担忧,因为 Reactivity Transform 需要一种不同的心智模型,它会扭曲 JavaScript 语义(变量赋值能够触发反应效果)。

考虑到所有因素,我们认为将其作为一个稳定的功能使用会导致问题多于收益,因此不是一个好的权衡。

迁移计划

留言

到此,相信大家对“Vue响应性语法糖怎么配置”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. 30道 Vue面试题的案例分析
  2. Vue面试经常会被问到的面试题有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue

上一篇:PHP小白怎么查找获取php.ini路径

下一篇:怎么正确封装ECharts

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》