Vueでアプリケーションを実装していた時に発生したエラーについて記載します。
状況
ボタンが2個あるページを作成しました。
ボタンが1個だったときはオブジェクトでも動いていたのですが、2個にしたところ次のエラーが発生しました。
The "data" option should be a function that returns a per-instance value in component definitions.
呼び出し元
それぞれ、CustomButton1
、CustomButton2
というコンポーネントを用意して次のように呼び出しました。
Vueインスタンスのel
は#app
です。
<div id="app"> <custom-button-1></custom-button-1> <custom-button-2></custom-button-2> </div>
コンポーネント
異なるコンポーネントを用意して、それぞれdata
オプションにcount
というパラメーターを設定していました。
CustomButton1
<script> export default { name: 'customButton1', data: { count: 0 }, } </script>
CustomButton2
<script> export default { name: 'customButton2', data: { count: 0 }, } </script>
原因
Vueのdata
オプションはコンポーネント間で共有しているため、data
で同名のオブジェクトを定義している場合は衝突します。
コンポーネントを使用する場合はオブジェクトではなく、関数で定義する必要があります
オブジェクトで定義しても問題ない場合
次の状態であればオブジェクト型のdata
でも動きます。
- コンポーネントを一つしか使わない。
- コンポーネントを複数使用するが、
data
オプションで定義するプロパティ名が重複しない
コンポーネントを複数使用する場合は、コンポーネント内のdataを関数にしておいた方が事故が起こりにくいです。
修正後
コンポーネントのdata
オプションをオブジェクトから、関数に変更しました。
コンポーネント
CustomButton1
<script> export default { name: 'customButton1', data: function() { return { count: 0 } //<---関数型に変更 }, } </script>
CustomButton2
<script> export default { name: 'customButton2', data: function() { return { count: 0 } //<---関数型に変更 }, } </script>