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

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

1回答

776閲覧

Nuxt.js 子コンポーネントから親コンポーネントのdataを変更する方法

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グッド

0クリップ

投稿2018/12/14 07:36

子コンポーネントから親コンポーネントの値を変更させようとしているのですが、下記のsetTemplate(template)メソッドで値の変更を行なっているのですが、下記のエラーが出てしまいます。

Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "template"

調べてみると子コンポーネントからpropsをいじるなとエラーがでているそうです。
親コンポーネント側のデータも変更が行われていないので、何か方法あれば教えていただいたです。

試して見た事

mounted: function() { let template_data = this.template } //テンプレートをセットするメソッド setTemplate(template) { this.template_data = template } 失敗:親コンポーネント側の値が変化せず。
data() { return { template_data: this.template, } }, //テンプレートをセットするメソッド setTemplate(template) { this.template_data = template } 失敗:同じく親コンポーネント側の値が変化せず。
<template> <div> <div v-for="template in templates"> <el-button :style="{ width: template.width / 3 + 'px', height: template.height / 3 + 'px', border: 'solid 1px', position: 'relative', float: 'left', 'vertical-align': 'middle', margin: '10px', }" @click="setTemplate(template)" > </el-button> </div> </div> </template> <script> export default { props: { template: { type: Object, default: () => ({ width: '', height: '', layers: [], }), }, }, components: {}, data() { return { templates: this.replaceTemplates(), } }, mounted: function() { let template_data = this.template }, methods: { getTemplates() { let templates = [ { id: 1, width: 300, height: 400, layers: [ { type: 'logo', width: 50, height: 50, x_position: 10, y_position: 10, z_index: 1 }, { type: 'image', width: 300, height: 200, x_position: 0, y_position: 80, z_index: 0 }, ], }, { id: 1, width: 400, height: 500, layers: [ { type: 'logo', width: 20, height: 50, x_position: 10, y_position: 100, z_index: 1 }, { type: 'image', width: 400, height: 50, x_position: 0, y_position: 250, z_index: 0 }, { type: 'text', width: 40, height: 10, x_position: 50, y_position: 10, z_index: 2 }, { type: 'text', width: 10, height: 10, x_position: 150, y_position: 200, z_index: 2 }, ], }, ] let response = JSON.stringify(templates) return JSON.parse(response) }, setTemplate(template) { this.template_data = template } }, } </script>

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

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

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

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

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

guest

回答1

0

v-model 使いましょう。詳細については省きますが、v-model に関しては公式ドキュメントが分かりづらいので Qiita などで適当に調べてみると良いですよ。

以下、親と子コンポーネントのサンプルコードです。

vue

1<template> 2 <div class="Parent"> 3 <child v-model="template" /> 4 </div> 5</template> 6 7<script> 8export default { 9 data() { 10 return { 11 template: '' 12 } 13 } 14} 15</script>

js

1export default { 2 model: { 3 prop: 'template', 4 event: 'change' 5 }, 6 7 props: { 8 template: { 9 type: Object, 10 default: () => ({ 11 width: '', 12 height: '', 13 layers: [], 14 }), 15 }, 16 }, 17 18 // 中略 19 20 methods: { 21 changeTemplate(template) { 22 this.$emit('change', template) 23 } 24 } 25}

投稿2018/12/14 11:46

yhg

総合スコア2161

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問