ホームページ >ウェブフロントエンド >Vue.js >Vue のリアクティブ構文シュガーは非推奨になったことに注意してください。
この記事では、Vue の最新状況をお届けします。主に Vue のレスポンシブ構文シュガーについて説明します。興味のある友達は一緒に見てください。皆さんのお役に立てれば幸いです。
複合 API の概念が導入されて以来、大きな未解決の問題が ref# でした。 ## と
reactive の間で 1 つを使用する必要がありますか?
reactive には分解により応答性が失われるという問題があり、一方
ref はあらゆる場所で使用する必要がある
.value は面倒に感じられ、型システム。
.value をドロップします。
<template> <button @click="increment">{{ count }}</button> </template>
ref を使用して、
count 変数と
increment メソッドを定義します。 ##<pre class="brush:php;toolbar:false">let count = ref(0)
function increment() {
count.value++
}</pre>
レスポンシブ構文シュガーを使用すると、次のようなコードを書くことができます:
let count = $ref(0) function increment() { count++ }Vue のレスポンシブ構文シュガーはコンパイル時の変換ステップ
コンパイル時マクロ コマンド
です。これは実行時に呼び出される実際のメソッドではありませんが、最終的な count を示す Vue コンパイラのマーカーとして使用されます。変数は リアクティブ変数
である必要があります。 リアクティブ変数は通常の変数と同様にアクセスして再割り当てできますが、これらの操作はコンパイル後に ref
になります。したがって、上記の例のコードも、ref
を使用して定義された構文にコンパイルされます。
$
が付いている対応するマクロ関数があります。次の 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
: <pre class="brush:php;toolbar:false">const { count } = defineProps<{ count: number }>()
passAsRef($$(count))</pre>
Configuration
の独自の機能であり、次のように変換する必要があります。ビルドステップ経由で使用されます。
必須、
// vite.config.js export default { plugins: [ vue({ reactivityTransform: true }) ] }
script.refSugar
には存在しなくなりました。 SFCにだけ効果があるわけではないからです。
ビルドの場合は、vue-loader@>=17.0.0
が必要ですが、現時点では SFC のみ有効です。 <pre class="brush:php;toolbar:false">// vue.config.js
module.exports = {
chainWebpack: (config) => {
config.module
.rule('vue')
.use('vue-loader')
.tap((options) => {
return {
...options,
reactivityTransform: true
}
})
}
}</pre>
vue-loader
がビルドされる場合、vue-loader@>=17.0.0
が必要です (現在は SFC のみ) 。 効果。 <pre class="brush:php;toolbar:false">// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
reactivityTransform: true
}
}
]
}
}</pre>
TS2304: 名前 '$ref' が見つかりません。
、影響はありませんが、使用には影響しますが、開発エクスペリエンスには影響します:
"compilerOptions":{ "types": ["vue/ref-macros"] }
ESLint: '$ ref' is not defined.(no-undef)
:
module.exports = { ...globals: { $ref: "readonly", $computed: "readonly", $shallowRef: "readonly", $customRef: "readonly", $toRef: "readonly", } };
tsconfig.json
と eslintrc
を構成する必要がなくなります。 。
import { $ref } from 'vue/macros' let count = $ref(0)
すでにご存知のとおり、私たちはチームの合意により、この RFC を正式に放棄しました。 #########理由######
Reactivity Transform の本来の目的は、リアクティブ状態を処理する際のよりクリーンな構文を提供することで開発者のエクスペリエンスを向上させることでした。実際の使用状況からのフィードバックを収集するための実験製品としてリリースしています。これらの提案された利点にもかかわらず、私たちは次の問題を発見しました:
.value
を失うと、何が追跡されているのか、どの行が反応性効果をトリガーしたのかを知ることが難しくなります。この問題は、小規模な SFC ではあまり明らかではありませんが、大規模なコード ベースでは、特に構文が SFC の外部でも使用されている場合、精神的なオーバーヘッドがより顕著になります。
(1) により、一部のユーザーは SFC 内でのみ Reactivity Transform を使用することを選択します。これにより、異なるメンタル モデル間で不一致とコンテキスト切り替えコストが生じます。つまり、SFC 内でのみ使用すると不整合が発生し、SFC の外で使用すると保守性が損なわれるというジレンマがあります。
生の参照を使用することを想定した外部関数が依然として存在するため、リアクティブ変数と生の参照の間の変換は避けられません。これにより、学習コンテンツと精神的負荷がさらに増え、初心者にとっては通常の Comboposition API よりも混乱することがわかりました。
最も重要なことは、断片化の潜在的なリスクです。これは明示的なオプトインですが、一部のユーザーは、この提案を使用することをオプトインしているユーザーもいれば、使用しないことを選択しているユーザーもいる、異なるコード ベースで作業する必要があるのではないかという懸念から、この提案に強い反対を表明しています。 Reactivity Transform には別のメンタル モデルが必要であり、JavaScript のセマンティクスが歪められるため、これは当然の懸念です (変数の割り当てによりリアクティブな効果が引き起こされる可能性があります)。
すべてのことを考慮すると、これを安定した機能として使用すると、利点よりも多くの問題が発生するため、良いトレードオフではないと考えています。
移行計画
メッセージ
props
デコンストラクションはどうでしょうか。これは今後も定着するのでしょうか?
中規模の電子商取引 Web サイトで問題なく使用しています。これを削除する理由は理解していますが、実際に使ってみると、これは非常に大きな改善であることがわかりました。そこで私の質問は、「今はどうなっているのか?」ということです。 ref()
を避け、以前のように reactive()
を使用することをお勧めしますか?
xxx.set()
と同様です。
すべての Reactivity Transform コードを変換するパッケージを作成するのは簡単ですよね?私も推奨された方法で物事を行うのが好きです。 以上がVue のリアクティブ構文シュガーは非推奨になったことに注意してください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。