155
121

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vue.jsは気難しい(オブジェクト編)

Last updated at Posted at 2017-03-10

本記事は Vue 2.2 時代(2017/03頃)に記載したものです。
最新のVueでは未検証です(たぶん通用すると思う)ご留意ください。

はじめに

Vue.jsはインスタンスが持つプロパティ(dataやprops)の変更を検知して、DOMの内容を変更したり、イベントの発火を行うことができる。
だが、それはdataやprops配下のオブジェクトの、変更を検知する機構が重要であるため
プレーンなJSのやりかたでオブジェクトを変更すると、その機構を失ってしまう。

失ってしまうとあら大変、オブジェクト内の値を変更してもDOMに反映されないし、vue-devtoolsにも表示されないという迷宮に、僕らは迷い込む。
そうならないための注意点です。

オブジェクトの気の遣い方

キーを追加したい

player オブジェクトに job キー(プロパティ)を追加する
(オブジェクトはそのキーを持っていないとする)

× いつものやり方でキー追加すると、検知機構を持たないプロパティになってしまう

this.player.job = { company: "インクリメンツ", income: "800" }};

setを使おう

this.$set(this.player, "job", { company: "インクリメンツ", income: "800" });

※ここで記載しているthisはコンポーネントのことです。
つまりコンポーネント内での記載を前提としています。
Vue.set(obj, key, val); っていう方法でもできる(実は this.$set()Vue.set() のエイリアス)けど、見通しが悪くなるので知らなくていいと思います。

複数のキーを一度に追加したい

Object.assignを使う

this.someObject = Object.assign({}, this.someObject, { company: "インクリメンツ", income: "800" });

これ、公式リファレンスにも記載されているやりかただけど、使わないほうがいいんじゃないかな…(なんか次のバージョンとかで非推奨になりそうな予感がする)

追加したいキーの数だけ$setを実行するとか
上記$setで予め構築しておいたオブジェクトを追加するなどしたほうがいい

var job = {
  company: "インクリメンツ",
  income: "800"
};
this.$set(this.player, "job", job);

(追記)
Object.assign() は、IE非対応なので注意! 参考 Object.assign()
assign.PNG

おわりに

Vue.jsの冒頭の説明にある「プレーンなオブジェクトのまま管理します」みたいな文言は嘘だよなと思う。

配列編も記載しているので、見てね

155
121
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
155
121

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?