ホームページ  >  記事  >  ウェブフロントエンド  >  Vue アプリケーションで vuex を使用するときに「エラー: [vuex] 変更ハンドラーの外で vuex ストアの状態を変更しません。」という問題を解決するにはどうすればよいですか?

Vue アプリケーションで vuex を使用するときに「エラー: [vuex] 変更ハンドラーの外で vuex ストアの状態を変更しません。」という問題を解決するにはどうすればよいですか?

PHPz
PHPzオリジナル
2023-06-24 19:04:293637ブラウズ

Vue アプリケーションでは、vuex の使用が一般的な状態管理方法です。ただし、vuex を使用すると、次のようなエラー メッセージが表示されることがあります: 「エラー: [vuex] は、変異ハンドラーの外で vuex ストアの状態を変異させません。」 このエラー メッセージは何を意味しますか?このエラー メッセージが表示されるのはなぜですか?このエラーを修正するにはどうすればよいですか?この記事では、この問題について詳しく説明します。

エラー プロンプトの意味

「エラー: [vuex] 変更ハンドラーの外で vuex ストアの状態を変更しません」は、vuex では、vuex の状態を変更関数の外部で直接変更できないことを意味します。言い換えれば、アプリケーションで vuex 状態 (状態) の値を変更するときは、状態の値を直接変更するのではなく、ミューテーション関数を通じて変更する必要があります。

これは、Vuex では state が唯一のデータソースであり、応答性の高いオブジェクトであるためで、state の値が変化すると、関連するコンポーネントが自動的に更新され、リアルタイムのデータ変化が実現されます。 state の値を直接変更すると、この応答メカニズムが失敗し、インターフェイスを更新できなくなります。

したがって、このエラー メッセージが表示された場合は、ミューテーション関数を介して変更するのではなく、コード内で状態値を直接変更したことを意味します。では、この間違いを避けるにはどうすればよいでしょうか?そのため、コードを記述するときにいくつかのルールに注意する必要があります。

このエラーを回避するにはどうすればよいですか?

このエラーを回避するには、次の 2 つのルールに従う必要があります。

  1. state の値は、ミューテーション関数でのみ変更できます

ミューテーション機能は、Vuex の核となる状態データを処理するために特別に使用されるメソッドです。アプリケーションで state の値を変更するときは、直接変更するのではなく、ミューテーションを通じて変更する必要があります。

サンプル コード:

// mutation函数用来修改state中的count值
const mutations = {
  addCount(state, num) {
    state.count += num;
  }
}

// 调用方法,修改state中的count值
this.$store.commit('addCount', 5);
  1. ミューテーション関数は同期的に実行する必要があります

ミューテーション関数は同期関数である必要があります。つまり、次の内容を含めることはできません。非同期操作 (setTimeout など)。これは、Vuex では、複数のミューテーション関数が登録順に確実に実行されるようにする必要があり、これは Vuex の応答メカニズムで要求されるためです。ミューテーション関数が非同期の場合、この順序は保証されず、状態を正しく更新できません。

サンプル コード:

// mutation函数
const mutations = {
  // 增加count值
  addCount(state, num) {
    setTimeout(() => {
      state.count += num; // 错误代码:包含异步操作
    }, 1000);
  }
}

// 调用方法
this.$store.commit('addCount', 5);

このようなエラーが発生した場合は、アクション関数を使用して、非同期操作からミューテーションを送信できます。サンプル コード:

// mutation函数
const mutations = {
  // 增加count值
  addCount(state, num) {
    state.count += num;
  }
}

// action函数,提交mutation
const actions = {
  asyncAddCount(context, num) {
    setTimeout(() => {
      context.commit('addCount', num); // 提交mutation
    }, 1000);
  }
}

// 调用方法,通过action间接调用mutation
this.$store.dispatch('asyncAddCount', 5);

このようにして、ミューテーション関数が引き続き同期的に実行されることを確認できます。

概要

Vue アプリケーションで vuex を使用すると、「エラー: [vuex] 変更ハンドラーの外で vuex ストアの状態を変更しません。」が表示されます。このエラー メッセージは、vuex を直接変更することを意味します。ミューテーション機能を使用せずに vuex の状態を変更することは、Vuex のルールに違反します。

このエラーを回避するには、コードを記述するときに次の 2 つの点に注意する必要があります。

  1. state の値は、ミューテーション関数内でのみ変更できます
  2. ミューテーション関数を同期的に実行する必要があります

非同期操作を使用する必要がある場合は、アクション関数を使用して非同期操作からミューテーションを送信できます。これらのルールに従うことで、この間違いを回避し、状態管理に Vuex を正常に使用できます。

以上がVue アプリケーションで vuex を使用するときに「エラー: [vuex] 変更ハンドラーの外で vuex ストアの状態を変更しません。」という問題を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。