Maison > Article > interface Web > Notez que le sucre syntaxique réactif de Vue est obsolète !
Cet article vous présente la dernière situation concernant Vue. Il parle principalement du sucre syntaxique réactif dans Vue. Les amis intéressés peuvent y jeter un œil ensemble. J'espère que cela sera utile à tout le monde.
Depuis l'introduction du concept d'API composites, une question majeure non résolue est de savoir laquelle utiliser entre ref
et reactive
. reactive
a le problème de perdre sa réactivité en raison de la déconstruction, tandis que ref
doit utiliser .value
partout, ce qui semble très fastidieux et ne fonctionne pas sans l'aide du système de types. Il est facile de manquer .value
. ref
和 reactive
到底用哪个。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++ }
$ref()
方法是一个编译时的宏命令,它不是一个真实的、在运行时会调用的方法,而是用作 Vue 编译器的标记,表明最终的 count
变量需要是一个响应式变量。.value
的 ref
。所以上面例子中的代码也会被编译成使用 ref
定义的语法。ref
的响应式 API 都有一个相对应的、以 $
为前缀的宏函数。包括以下这些 API:$()
宏来将现存的 ref
转换为响应式变量。const a = ref(0) let count = $(a) count++ console.log(a.value) // 1
$$()
宏来将任何对响应式变量的引用都会保留为对相应 ref
的引用。let count = $ref(0) console.log(isRef($$(count))) // true
$$()
也适用于已解构的 props
,因为它们也是响应式的变量。编译器会高效地通过 toRef
来做转换:
const { count } = defineProps<{ count: number }>() passAsRef($$(count))
响应性语法糖是 组合式 API 特有的功能,且必须通过构建步骤使用。
@vitejs/plugin-vue@>=2.0.0
,将应用于 SFC 和 js(x)/ts(x) 文件。// vite.config.js export default { plugins: [ vue({ reactivityTransform: true }) ] }
reactivityTransform
现在是一个插件的顶层选项,而不再是位于 script.refSugar
之中了,因为它不仅仅只对 SFC 起效。如果是 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 } } ] } }
tsconfig.json
文件中添加如下代码, 不然会报错 TS2304: Cannot find name '$ref'.
,虽然不影响使用,但是会影响开发体验:"compilerOptions":{ "types": ["vue/ref-macros"] }
eslintrc.cjs
文件中添加如下代码,不然会提示 ESLint: '$ref' is not defined.(no-undef)
:module.exports = { ...globals: { $ref: "readonly", $computed: "readonly", $shallowRef: "readonly", $customRef: "readonly", $toRef: "readonly", } };
vue/macros
,这样就不用配置第二和第三步中的 tsconfig.json
和 eslintrc
import { $ref } from 'vue/macros' let count = $ref(0)
ref
pour définir la variable count
et la méthode increment
: Le sucre de syntaxe réactif de Vue est une étape de conversion au moment de la compilation, et la méthode $ref()
est une commande de macro au moment de la compilation , Ce n'est pas une vraie méthode qui sera appelée au moment de l'exécution, mais est utilisée comme indicateur pour le compilateur Vue pour indiquer que la variable count
finale doit être une
Les variables réactives sont accessibles et réaffectées comme des variables ordinaires, mais ces opérations deviendront ref
avec .value
après la compilation. Ainsi, le code de l'exemple ci-dessus sera également compilé dans la syntaxe définie à l'aide de ref
. Chaque API réactive qui renvoie ref
a une fonction macro correspondante préfixée par $
. Y compris les API suivantes :
$()
pour convertir un ref
existant en une variable réactive. rrreeeVous pouvez utiliser la macro
$$()
pour conserver toute référence à une variable réactive comme référence au ref
correspondant .
$$()
fonctionne également avec des props
déstructurés car ce sont également des variables réactives. Le compilateur effectuera efficacement la conversion via toRef
: 🎜rrreee🎜Configuration🎜🎜Le sucre syntaxique réactif est une fonctionnalité spécifique à l'🎜API Composition🎜 et doit être utilisée tout au long de l'étape de construction. 🎜@vitejs/plugin-vue@>=2.0.0
, sera appliqué aux fichiers SFC et js(x)/ts(x). 🎜🎜rrreeereactivityTransform
est désormais une option de niveau supérieur d'un plugin, et ne se trouve plus dans script.refSugar
, car ce n'est pas seulement pour SFC Prendre effet. 🎜🎜🎜S'il est construit avec vue-cli
, vue-loader@>=17.0.0
est requis. Actuellement, il ne fonctionne que pour SFC. 🎜rrreee🎜S'il est construit avec webpack
+ vue-loader
, vue-loader@>=17.0.0
est requis, actuellement uniquement pour l'effet SFC. 🎜rrreeetsconfig.json
, sinon une erreur sera signalée TS2304 : Impossible de trouver le nom '$ref'.
, bien que cela n'affecte pas l'utilisation, cela affectera l'expérience de développement : 🎜🎜rrreeeeslintrc.cjs
fichier, sinon il demandera ESLint : '$ref' n'est pas défini.(no-undef)
:🎜🎜rrreeevue/macros
dans le fichier vue, afin de ne pas avoir besoin de configurer tsconfig.json
et eslintrc
dans les deuxième et troisième étapes > . 🎜🎜rrreee🎜Fonction expérimentale obsolète🎜🎜🎜🎜Le sucre de syntaxe réactif était autrefois une fonctionnalité expérimentale et est obsolète, veuillez lire 🎜Raison de la dépréciation🎜. 🎜🎜🎜🎜Il sera supprimé du noyau Vue dans une future mise à jour de version mineure. Si vous souhaitez continuer à l'utiliser, veuillez utiliser le plugin 🎜Vue Macros🎜. 🎜🎜🎜🎜Raison de l'abandon🎜🎜Vous Yuxi avez personnellement donné la raison de l'abandon il y a 2 semaines (21 février 2023, 10h05 GMT+8). La traduction est la suivante : 🎜🎜Tout comme beaucoup d'entre vous en tant que personnes. nous le savons déjà, nous avons officiellement abandonné cette RFC par consensus de l'équipe. 🎜🎜🎜Raisons🎜🎜L'objectif initial de Reactivity Transform était d'améliorer l'expérience des développeurs en fournissant une syntaxe plus propre lors du traitement de l'état réactif. Nous le publions en tant que produit expérimental pour recueillir des commentaires sur une utilisation réelle. Malgré ces avantages proposés, nous avons constaté les problèmes suivants :
La perte de .value
rend plus difficile la détermination de ce qui est suivi et quelle ligne déclenche l'effet réactif. Ce problème est moins évident dans les petits SFC, mais dans les grandes bases de code, la surcharge mentale devient plus évidente, surtout si la syntaxe est également utilisée en dehors des SFC. .value
使得更难分辨正在跟踪的内容以及哪条线触发了反应效果。这个问题在小型 SFC 中并不那么明显,但在大型代码库中,心理开销变得更加明显,特别是如果语法也在 SFC 之外使用。
由于 (1),一些用户选择仅在 SFC 内部使用 Reactivity Transform,这会在不同心智模型之间造成不一致和上下文转换成本。因此,困境在于仅在 SFC 内部使用它会导致不一致,但在 SFC 外部使用它会损害可维护性。
由于仍然会有外部函数期望使用原始引用,因此反应变量和原始引用之间的转换是不可避免的。这最终增加了更多的学习内容和额外的精神负担,我们注意到这比普通的 Composition API 更让初学者感到困惑。
最重要的是,碎片化的潜在风险。尽管这是明确的选择加入,但一些用户对该提议表示强烈反对,原因是他们担心他们将不得不与不同的代码库一起工作,在这些代码库中,有些人选择了使用它,而有些人则没有。这是一个合理的担忧,因为 Reactivity Transform 需要一种不同的心智模型,它会扭曲 JavaScript 语义(变量赋值能够触发反应效果)。
考虑到所有因素,我们认为将其作为一个稳定的功能使用会导致问题多于收益,因此不是一个好的权衡。
迁移计划
留言
ref.value
进行转换的部分?响应式 props
解构呢,它会留下来吗?.value
的人现在尽可能避免使用 ref()
并像以前那样使用 reactive()
?.value
是必要的复杂性。就像任何其他响应式库 xxx.set()
Plus important encore, le risque potentiel de fragmentation. Bien qu'il s'agisse d'un opt-in explicite, certains utilisateurs ont exprimé une forte opposition à la proposition en raison des craintes de devoir travailler avec des bases de code différentes, certains ayant choisi de l'utiliser et d'autres non. Il s'agit d'une préoccupation légitime car Reactivity Transform nécessite un modèle mental différent et déforme la sémantique JavaScript (les affectations de variables peuvent déclencher des effets réactifs).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!