質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

3023閲覧

【Nuxt.js】computedでオブジェクトの中身まで検知してほしい【vue.js】

tokuwgawa

総合スコア45

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

4クリップ

投稿2019/01/11 01:56

編集2019/01/15 04:01
//検知 computed: { template() { return this.template } },
//データ data() { return { template: { id: 1, width: 400, height: 500, layers: [ {id: 1, value: "doragon"}, {id: 2, value: "neko"}, {id: 3, value: "inu"}, {id: 4, value: "usagi"}, ], }, } },

この様な処理の時に例えば別の関数で

setLayers(layer) { this.template.layers.push(layer) }

templateの中のlayersの中で変更が起きてもこの書き方のcomputedでは変更が起きません。
どうすればオブジェクトの中の値変更までcomputedで検知してくれる様な処理にできますか?

#追記
自分の実装載せます。

//親コンポーネント <template> <div class="create"> <Preview :tmp_template="template"/> <image :tmp_template="template" v-model="template" @setTmpTemplate="setTemplate"/> </div> </template> <script> export default { components: { Preview: () => import('@/components/preview.vue'), Image: () => import('@/components/image.vue'), }, data() { return { template: { id: "", width: 0, height: 0, layers: [], }, } }, methods: { setTemplate(template) { this.template = template }, }, } </script>

親コンポーネントでcomputedで検知するデータを作成しています。

//子コンポーネント //Image.vue <template> <div> <div v-for="image in layer"> <el-input v-model="image.value"></el-input> </div> </div> </template> <script> export default { props: ['tmp_template'], computed: { layer() { return this.tmp_template.layers.filter(function (layer) { if(layer.type === 'image') { console.log(layer) return layer } }) } }, } </script>

image.vueObjectの一番下のネストの値を変更しています。

//子コンポーネント //preview.vue <script> export default { props: ['tmp_template'], mounted() { this.ctx = this.$el.firstChild.firstElementChild.getContext('2d') this.drawCreative() }, computed: { template() { return this.tmp_template } }, watch: { template(val) { this.drawCreative() } }, methods: { drawCreative() { this.ctx.canvas.width = this.tmp_template.width this.ctx.canvas.height = this.tmp_template.height this.tmp_template.layers.forEach(layer => { this.ctx.fillText(layer.value, layer.x_position, layer.y_position - -10) }); }, }, } </script>

別の子コンポーネントでimage.vueで入力して値変更されたtmp_templateを監視しているのですが、検知されません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問内容のsetLayersなら機能すると思いますが……。
本文中に「値変更」とあるので、

javascript

1changeLayer(num, layer){ 2 this.template.layers[num] = layer 3}

のようになっていると仮定して回答します。公式ドキュメントのリストレンダリング>配列の変化を検出の項によると、Vueはこの変更を検出できません。

javascript

1changeLayer(num, layer){ 2 this.template.layers.splice(num, 1, layer) 3}

上記のようにすれば大丈夫だと思います。詳細は先のリンクを参照してください。

投稿2019/01/17 23:50

7Kreuz

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

やりたいことが不明瞭ですが、おそらく「Vueに、配列への操作を検知してほしい」のだと思うので、
computedを使わずともできます。

<template> <div> <ul> <li v-for="layer in template.layers"> <p>ID: {{ layer.id }}, VALUE: {{ layer.value }}</p> </li> </ul> <div> <input ref="id-input" type="text" value="" placeholder="ID"> <input ref="value-input" type="text" value="" placeholder="VALUE"> <button type="button" @click="addLayer">Add Layer</button> </div> </div> </template> <script> export default { name: 'app', data () { return { template: { id: 1, width: 400, height: 500, layers: [ { id: 1, value: "doragon" }, { id: 2, value: "neko" }, { id: 3, value: "inu" }, { id: 4, value: "usagi" } ] } } }, methods: { addLayer () { const id = this.$refs['id-input'].value const value = this.$refs['value-input'].value this.template.layers.push({ id, value }) } } } </script>

参考リンク
配列の変更検知について
Vue.jsのデータ変更検知の仕組み
vm.$refsについて

投稿2019/01/12 10:43

NozomuIkuta

総合スコア1260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokuwgawa

2019/01/15 00:28

内容不十分で申し訳ありません。 複数の子コンポーネントから親コンポーネントの値変更を検知したいので、computedを使っています。
NozomuIkuta

2019/01/16 14:26

setTmpTemplateの実装が見当たりませんが、どちらでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問