データ内の一部のデータは、テンプレート内の補間構文を通じて直接表示できることはわかっていますが、場合によっては、データを表示する前にデータに対して何らかの変換を実行する必要がある場合があります。複数のデータを結合して表示する必要がある
テンプレートで式を使用すると非常に便利ですが、元々は単純な操作用に設計されているため、テンプレートにロジックを入れすぎるとテンプレートが重くなり、メンテナンスが困難になります複数の場所で使用される場合、重複コードが大量に発生するため、ビジネス ロジックと UI インターフェイスを分離したいと考えています。ロジックをメソッドに抽出することも 1 つの方法ですが、このアプローチは次の欠点があります。
<div id="app"> <!-- 计算属性的使用和普通状态的使用方式是一致的 --> <h3>{{ fullname }}</h3> </div> <script> Vue.createApp({ data() { return { firstname: 'Klaus', lastname: 'Wang' } }, computed: { fullname() { return this.firstname + ' ' + this.lastname } } }).mount('#app')
キャッシュ
計算されたプロパティは、その依存関係に基づいてキャッシュされます。データが変更されない場合、計算されたプロパティは再計算する必要はありません。ただし、依存データが変更された場合、計算されたプロパティは引き続き再計算されます。使用すると、#そしてインターフェイスは最新の計算されたプロパティ値を使用して再レンダリングされます
#ゲッターとセッター計算されたプロパティ ほとんどの場合、必要なゲッター メソッドは 1 つだけです。そのため、計算されたプロパティを関数として直接記述します。<div id="app"> <!-- 计算属性的使用和普通状态的使用方式是一致的 --> <h3>{{ fullname }}</h3> <button @click="change">change</button> </div> <script> Vue.createApp({ data() { return { firstname: 'Klaus', lastname: 'Wang' } }, methods: { change() { this.fullname = 'Alex Li' } }, computed: { // 计算属性的完整写法 fullname: { get() { return this.firstname + ' ' + this.lastname }, set(v) { this.firstname = v.split(' ')[0] this.lastname = v.split(' ')[1] } } } }).mount('#app') </script>
Vue.createApp({ data() { return { info: { name: 'Klaus' } } }, watch: { // 可以使用watch监听响应式数据的改变 // 对应有两个参数 // 参数一 --- 新值 // 参数二 --- 旧值 info(newV, oldV) { // 如果监听的值是对象,获取到的新值和旧值是对应对象的代理对象 console.log(newV, oldV) // 代理对象 转 原生对象 // 1. 使用浅拷贝获取一个新的对象,获取的新的对象为原生对象 console.log({...newV}) // 2. 使用Vue.toRaw方法获取原生对象 console.log(Vue.toRaw(newV)) } }, methods: { change() { this.info = { name: 'Steven' } } } }).mount('#app')
deep | オンにするかどうか深い監視の場合 |
---|---|
開始後、オブジェクトが監視されている場合、オブジェクト内のいずれかの属性が変更される限り、監視コールバックがトリガーされます | immediate | すぐに監視を開始するかどうか
Vue.createApp({ data() { return { info: { name: 'Klaus' } } }, watch: { info: { // 开启了深度监听后,当info的属性发生改变的时候,就会触发对应的watch回调 // 注意: 和直接修改info引用不同的是,如果直接修改的是对象的属性 // 那么此时newV和oldV是同一个对象的引用, 此时也就获取不到对应的旧值 handler(newV, oldV) { console.log(newV, oldV) console.log(newV === oldV) // => true }, deep: true, immediate: true } }, methods: { change() { this.info.name = 'Steven' } } }).mount('#app') ログイン後にコピー その他の記述方法 |
watch: { 'info.name'(newV, oldV){ console.log(newV, oldV) } }
文字列の書き込み方法
Vue.createApp({ data() { return { info: { name: 'Klaus' } } }, watch: { // watch的值如果是一个字符串的时候 // 会自动以该字符串作为函数名去methods中查找对应的方法 'info.name': 'watchHandler' }, methods: { change() { this.info.name = 'Steven' }, watchHandler(newV, oldV){ console.log(newV, oldV) } } }).mount('#app')
配列の書き込み方法
Vue.createApp({ data() { return { info: { name: 'Klaus' } } }, watch: { 'info.name': [ 'watchHandler', function handle() { console.log('handler2') }, { handler() { console.log('handler3') } } ] }, methods: { change() { this.info.name = 'Steven' }, watchHandler(){ console.log('handler1') } } }).mount('#app')
$watchリーリー
以上がVue3 で計算プロパティとリスナーを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。