[解決済み] [Vue警告]: プロパティまたはメソッドがインスタンスで定義されておらず、レンダリング中に参照される
質問
var MainTable = Vue.extend({
template: "<ul>" +
"<li v-for='(set,index) in settings'>" +
"{{index}}) " +
"{{set.title}}" +
"<button @click='changeSetting(index)'> Info </button>" +
"</li>" +
"</ul>",
data: function() {
return data;
}
});
Vue.component("main-table", MainTable);
data.settingsSelected = {};
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
上記のコードで、ボタンをクリックすると、以下のエラーが発生します。
[Vue warn]: プロパティまたはメソッド "changeSetting" はインスタンスで定義されていませんが、レンダリング中に参照されます。必ずdataオプションでreactive dataプロパティを宣言してください。(以下の場所で見つかります
<MainTable>
)
解決方法は?
問題点
<ブロッククオート
[Vue warn]: Property or method "changeSetting" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option. (found in <MainTable>)
エラーが発生しているのは
changeSetting
メソッドが参照されています。
MainTable
コンポーネントがあります。
"<button @click='changeSetting(index)'> Info </button>" +
しかし
changeSetting
メソッドが定義されていないため
MainTable
コンポーネントを使用します。ここでは、ルートコンポーネントで定義されています。
var app = new Vue({
el: "#settings",
data: data,
methods: {
changeSetting: function(index) {
data.settingsSelected = data.settings[index];
}
}
});
覚えておく必要があるのは、プロパティとメソッドは、それらが定義されているスコープでのみ参照できるということです。
親テンプレートにあるものはすべて親スコープでコンパイルされ、子テンプレートにあるものはすべて子スコープでコンパイルされます。
コンポーネントのコンパイル・スコープについては、Vueの ドキュメント .
どうしたらいいのでしょうか?
これまでのところ、正しいスコープで定義することについて多くの議論がなされてきました。
changeSetting
の定義を
MainTable
コンポーネントを使用しますか?
そんな簡単なことのように思えますが、私がお勧めするのは次のようなことです。
おそらく
MainTable
コンポーネントは、ダム/プレゼン テーション・コンポーネントにします。(
ここで
が何かわからない場合は、これを読んでみてください。) スマート/コンテナ要素はロジックを担当します。質問にある例では、ルートコンポーネントはスマート/コンテナ要素になります。このアーキテクチャでは、Vueの親子間通信メソッドを使用して、コンポーネントを相互作用させることができます。のデータを渡すと
MainTable
を経由して
プロップス
からユーザーアクションを発信し
MainTable
を経由してその親に
イベント
. 以下のような感じでしょうか。
Vue.component('main-table', {
template: "<ul>" +
"<li v-for='(set, index) in settings'>" +
"{{index}}) " +
"{{set.title}}" +
"<button @click='changeSetting(index)'> Info </button>" +
"</li>" +
"</ul>",
props: ['settings'],
methods: {
changeSetting(value) {
this.$emit('change', value);
},
},
});
var app = new Vue({
el: '#settings',
template: '<main-table :settings="data.settings" @change="changeSetting"></main-table>',
data: data,
methods: {
changeSetting(value) {
// Handle changeSetting
},
},
}),
上記は、何をすべきかの良いアイデアを与え、問題解決を始めるのに十分であるべきです。
関連
-
fetch ネットワークリクエストラッパーの説明例
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
vueが定義するプライベートフィルタと基本的な使い方
-
[解決済み】最大呼び出しスタックサイズ超過エラー
-
[解決済み】TypeScript-のAngular Frameworkエラー - "exportAsがngFormに設定されたディレクティブはありません"
-
[解決済み】ExpressJS : res.redirect()が期待通りに動かない?
-
[解決済み】React Uncaught Error: 対象コンテナが DOM 要素でない [重複]。
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vue3レスポンシブ対応のためのsetup+ref+reactive
-
JavaScriptの関数この指摘の問題を説明
-
要素ツリー制御によるvueTreeテーブル
-
JSアレイループと効率解析の比較
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み】SyntaxError: JSONの位置1に予期しないトークンoがある。
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
[解決済み】TypeErrorの解決方法。未定義またはヌルをオブジェクトに変換できない
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR
-
JavaScriptのgetElementById、getElementsByTagNam、getElementsByClassNameの違いと使い方