ホームページ  >  記事  >  ウェブフロントエンド  >  Vue.js での computed の使用方法の詳細な説明

Vue.js での computed の使用方法の詳細な説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-03 15:43:283153ブラウズ

今回は、Vue.js での computed の使用について詳しく説明します。Vue.js で computed を使用する際の 注意事項 は何ですか?実際の事例を見てみましょう。

JS 属性:

JavaScript には、 <a href="http://www.php.cn/wiki/60.html" target="_blank">Object という機能があります。 </a> .defineProperty は多くのことを実行できますが、この記事ではこれらのメソッドの 1 つだけに焦点を当てます: <a href="http://www.php.cn/wiki/60.html" target="_blank">Object</a>.defineProperty

var person = {};
Object.defineProperty (person, 'age', {
 get: function () {
  console.log ("Getting the age");
  return 25;
 }
});
console.log ("The age is ", person.age);
// Prints:
//
// Getting the age
// The age is 25

(Obeject.defineProperty は Object のメソッドであり、最初のパラメータはオブジェクト名、2 番目のパラメータはパラメータは設定するプロパティの名前で、3 番目のパラメータはプロパティを変更できるかどうか、書き込み可能かどうかなどを設定できるオブジェクトです。この記事では主に Object.defineProperty のアクセサ プロパティを使用します。 Google で検索するか、Js Advanced と Programming を確認してください)

person.age はオブジェクトのプロパティにアクセスしているように見えますが、実際には内部で関数を実行しています。

基本的にレスポンシブな Vue.js

Vue.js は、通常のオブジェクトを監視できる値 (レスポンシブ属性) に変換できるオブジェクトを内部的に構築します。 ここでは、レスポンシブ属性を追加する方法の簡略版を示します。 :

function defineReactive (obj, key, val) {
 Object.defineProperty (obj, key, {
  get: function () {
   return val;
  },
  set: function (newValue) {
   val = newValue;
  }
 })
};
// 创建一个对象
var person = {};
// 添加可响应的属性"age"和"country"
defineReactive (person, 'age', 25);
defineReactive (person, 'country', 'Brazil');
// 现在你可以随意使用person.age了
if (person.age < 18) {
 return &#39;minor&#39;;
}
else {
 return &#39;adult&#39;;
}
// 设置person.country的值
person.country = &#39;Russia&#39;;

興味深いことに、25 と 'Brazil' もクロージャ内の

変数 であり、val は新しい値が割り当てられた場合にのみ変更されます。 person.country には値「Brazil」がありませんが、ゲッター関数には値「Brazil」があります。

計算されたプロパティを宣言する

計算されたプロパティを定義する関数defineComputedを作成しましょう。この機能は通常computedを使用する場合と同じです。

defineComputed (
 person, // 计算属性就声明在这个对象上
 &#39;status&#39;, // 计算属性的名称
 function () { // 实际返回计算属性值的函数
  console.log ("status getter called")
  if (person.age < 18) {
   return &#39;minor&#39;;
  }
  else {
   return &#39;adult&#39;;
  }
 },
 function (newValue) {
  // 当计算属性值更新时调用的函数
  console.log ("status has changed to", newValue)
 }
});
// 我们可以像使用一般的属性一样使用计算属性
console.log ("The person&#39;s status is: ", person.status);

compute メソッドの呼び出しをサポートする単純な defineComputed 関数を作成しましょう。ただし、現時点では updateCallback をサポートする必要はありません。

function defineComputed (obj, key, computeFunc, updateCallback) {
 Object.defineProperty (obj, key, {
  get: function () {
   // 执行计算函数并且返回值
   return computeFunc ();
  },
  set: function () {
   // 什么也不做,不需要设定计算属性的值
  }
 })
}

この関数には 2 つの問題があります:

計算された属性にアクセスするたびに計算関数 computeFunc () が実行されます

いつ更新するかがわかりません (つまり、特定のデータの属性を更新するとき、計算された属性も更新されます)

// 我希望最终函数执行后是这个效果:每当person.age更新值的时候,person.status也同步更新
person.age = 17;
// console: status 的值为 minor
person.age = 22;
// console: status 的值为 adult

依存関係を追加します

グローバル変数 Dep:

var Dep = {
 target: null
};

これは依存関係を追加しましょう。そして、クールな操作を使用して、defineComputed を更新しますfunction:

function defineComputed (obj, key, computeFunc, updateCallback) {
 var onDependencyUpdated = function () {
  // TODO
 }
 Object.defineProperty (obj, key, {
  get: function () {
   // 将onDependencyUpdated 这个函数传给Dep.target
   Dep.target = onDependencyUpdated;
   var value = computeFunc ();
   Dep.target = null;
  },
  set: function () {
   // 什么也不做,不需要设定计算属性的值
  }
 })
}

次に、前に設定した応答プロパティに戻りましょう:

function defineReactive (obj, key, val) {
 // 所有的计算属性都依赖这个数组
 var deps = [];
 Object.defineProperty (obj, key, {
  get: function () {
   // 检查是否调用了计算属性,如果调用了,Department.target将等于一个onDependencyUpdated函数
   if (Dep.target) {
    // 把onDependencyUpdated函数push到deos中
    deps.push (target);
   }
   return val;
  },
  set: function (newValue) {
   val = newValue;
   // 通知所有的计算属性,告诉它们有个响应属性更新了
   deps.forEach ((changeFunction) => {
    changeFunction ();
   });
  }
 })
};
計算されたプロパティによって定義された関数が更新コールバックをトリガーした後、onDependencyUpdated 関数を更新できます。

var onDependencyUpdated = function () {
 // 再次计算 计算属性的值
 var value = computeFunc ();
 updateCallback (value);
}
それらを統合します:

計算された属性 person.status をもう一度見てみましょう:

person.age = 22;
defineComputed (
 person,
 'status',
 function () {
  if (person.age > 18) {
   return 'adult';
  }
 },
 function (newValue) {
  console.log ("status has changed to", newValue)
 }
});
console.log ("Status is ", person.status);
この記事の事例を読んだ後は、この方法を習得したと思います。さらにエキサイティングな内容については、 の他の関連記事に注目してください。 PHP中国語ウェブサイトです!

推奨読書:

Vue.jsのcomputedメソッドとメソッドの使用法と違い

それぞれがルートジャンプ検証機能を実装する前

以上がVue.js での computed の使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。