検索
ホームページウェブフロントエンドVue.jsVuexとは何ですか? Vuex 4 の初心者ガイド

この記事では、Vuex について説明し、アプリケーションで Vuex を使用する方法を紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Vuexとは何ですか? Vuex 4 の初心者ガイド

Vuex は、Vue.js エコシステムに不可欠なツールです。しかし、Vuex を初めて使用する開発者は、「状態管理パターン」などの用語に抵抗があり、実際に Vuex が必要なものについて混乱する可能性があります。 [関連する推奨事項: "vue.js チュートリアル "]

この記事は Vuex の紹介です。もちろん、Vuex の高度な概念についても説明し、Vuex の使用方法も説明します。アプリケーションで。

Vuex が解決する問題

Vuex を理解するには、まず Vuex が解決する問題を理解する必要があります。

マルチユーザー チャット アプリケーションを開発するとします。このインターフェイスには、ユーザー リスト、プライベート チャット ウィンドウ、チャット履歴のある受信箱、および現在表示されていない他のユーザーからの未読メッセージをユーザーに通知する通知バーがあります。

毎日、何百万ものユーザーがアプリを通じて他の何百万ものユーザーとチャットしています。ただし、通知シェードが時々誤った通知を表示するという迷惑な問題について苦情を言う人もいます。ユーザーには新しい未読メッセージが通知されますが、ユーザーがそれを表示すると、それはすでに表示されたメッセージにすぎません。

この著者が説明しているのは、数年前に Facebook 開発者がチャット システムで遭遇した実際の状況です。この問題を解決するために、開発者は "Flux" と呼ばれるアプリケーション アーキテクチャを作成しました。 Flux は、Vuex、Redux、およびその他の同様のライブラリの基礎を形成します。

Flux

Facebook 開発者は、しばらくの間「ゾンビ通知」の問題に取り組んできました。彼らは最終的に、その永続性が単なる欠陥ではなく、アプリケーションのアーキテクチャの根本的な欠陥を示していることに気づきました。

この欠陥は、抽象的に理解するのが最も簡単です。アプリケーション内にデータを共有する複数のコンポーネントがある場合、それらの相互接続の複雑さは、データの状態を予測または理解できない点まで増加します。したがって、アプリケーションを拡張または保守することはできません。

Flux はパターンであり、ライブラリではありません。 Github にアクセスして Flux をダウンロードすることはできません。 MVCに似たデザインパターンです。 Vuex や Redux などのライブラリは、他のフレームワークが MVC パターンを実装するのと同じ方法で Flux パターンを実装します。

実際、Vuex は Flux のすべてを実装しているわけではなく、サブセットのみを実装しています。しかし、今はそんなことは心配しないで、それが従う重要な原則を理解することに集中しましょう。

原則 1: 単一ソース

コンポーネントには、理解することのみが必要なローカル データが含まれる場合があります。たとえば、ユーザー リスト コンポーネント内のスクロール バーの位置は、他のコンポーネントから独立している場合があります。

ただし、コンポーネント間で共有されるデータ (つまり、アプリケーション データ) は、それを使用するコンポーネントとは別の場所に保管する必要があります。

この 1 つの場所を「ストア」と呼びます。コンポーネントはこの場所からアプリケーション データを読み取る必要があり、競合や相違を防ぐために独自のコピーを保持することはできません。

import { createStore } from "vuex";

// Instantiate our Vuex store
const store = createStore({

  // "State" 组件的应用程序数据
  
  state () {
    return {
      myValue: 0
    };
  }
});

// 组件从其计算的属性访问 state 
const MyComponent = {   
  template: "<div>{{ myValue }}</div>",
  computed: {
    myValue () {
      return store.state.myValue;
    }   
  } 
};

原則 2: データは読み取り専用です

コンポーネントは store から自由にデータを読み取ることができます。ただし、store のデータは、少なくとも直接的には変更できません。

代わりに、データを変更する意図を store に通知する必要があります。store は、mutation# と呼ばれる定義済みの関数セットを通過させる責任があります。 # #) 変更を加えます。

なぜこの方法を使用するのでしょうか?データ変更ロジックを一元化すると、ステータスに一貫性がない場合に、特定のファイルを個別に確認することなく、同じ場所で確認するだけで済みます。ランダムなコンポーネント (おそらくサードパーティのモジュール内) が予期しない方法でデータを変更する可能性を最小限に抑えます。

const store = createStore({ 
  state() { 
    return {
      myValue: 0
    };
  }, 
  mutations: { 
    increment (state, value) { 
      state.myValue += value;
    }
  } 
});
// 需要更新值吗?
// 错误的,不要直接更改 store 值
store.myValue += 10;
// 正确的,调用正确的 mutations。
store.commit(&#39;increment&#39;, 10);

原則 3: 変更は同期的である

アプリケーションがそのアーキテクチャに上記の 2 つの原則を実装している場合、データの不整合のデバッグがはるかに簡単になります。コミットをログに記録し、状態がどのように変化するかを監視できます (これは、Vue Devtools を使用する場合に実際に可能です)。

しかし、

mutation が非同期的に呼び出される場合、この機能は弱まります。送信の順序はわかっていますが、コンポーネントが送信する順序はわかりません。

同期

突然変異により、状態が予測不可能なイベントの順序やタイミングに依存しないことが保証されます。

とてもクールですが、Vuex とは一体何ですか?

これだけの背景知識があれば、最終的に問題を解決できます。Vuex は、Vue アプリケーションに Flux アーキテクチャを実装するのに役立つライブラリです。上記の原則を強制することにより、Vuex は、複数のコンポーネント間でデータが共有されている場合でも、アプリケーション データを透過的で予測可能な状態に保ちます。

Vuex について概要を理解したところで、実際のプロジェクトで Vuex ベースのアプリケーションを作成する方法を見てみましょう。

Vuex を使用して To Do リストを作成する

Vuex の使用方法を示すために、簡単な To Do アプリケーションをセットアップします。ここからコードの実例にアクセスできます。

示例地址:https://codesandbox.io/s/happ...

如果大家自己的电脑尝试一波,那么可以使用下面的命令:

vue create vuex-example

安装 Vuex

cd vuex-example
npm i -S vuex@4
npm run serve

创建一个 Vuex store

现在,创建 Vuex store,在项目中创建 src/store/index.js

mkdir src/store
touch src/store/index.js

打开文件并导入createStore方法。此方法用于定义store及其特性。现在,我们导出该store ,以便在Vue应用中能访问它。

// src/store/index.js

import { createStore } from "vuex";

export default createStore({});

将 store  添加到 Vue 实例

为了可以从任何组件中访问 Vuex store,我们需要在主文件中导入 store 模块,并将store作为插件安装在主Vue实例上

// src/main.js

import { createApp } from "vue";
import App from "@/App";
import store from "@/store";

const app = createApp(App);

app.use(store);

app.mount("#app");

创建一个简单的应用程序

如上所述,Vuex 的重点是通常在大型应用程序中创建可扩展的全局状态。 但是,我们可以在一个简单的待办应用程序中演示其功能。

完成后效果如下所示:

Vuexとは何ですか? Vuex 4 の初心者ガイド

现在,删除 HelloWorld 文件:

rm src/components/HelloWorld.vue

TodoNew.vue

现在,添加一个新组件 TodoNew,它负责创建新的待办事项。

touch src/components/TodoNew.vue

打开 TodoNew.vue 并输入以下内容:

// src/components/TodoNew.vue

<template>
  <form @submit.prevent="addTodo">
    <input
      type="text"
      placeholder="Enter a new task"
      v-model="task"
    />
  </form>
</template>

现在转到组件定义,有两个局部状态属性-task和给新待办事项提供唯一标识符的id

// src/components/TodoNew.vue

<template>...</template>
<script>
export default {
  data() {
    return {
      task: "",
      id: 0
    };
  },
  methods: {
    addTodo: function() {
      //
    }
  }
};
</script>

定义 store 状态

过会,我们会创建一个显示待办事项的组件。 由于它和TodoNew组件都需要访问相同的数据,因此这是我们在 Vuex 存储中保存的全局state 的理想选择。

现在,回到state并定义属性状态。 这里使用 Vux4 提供的 createStore 函数,该函数返回一个对象。 该对象具有一个属性 todos,它是一个空数组。

// src/store/index.js
import { createStore } from "vuex";

export default createStore({
  state () {
    return {
      todos: []
    }
  }
});

定义 mutation

从原则2可以知道,Vuex state 不能直接更改,需要定义mutator函数。

现在,我们向store添加一个mutation属性,并添加一个函数属性addTodo。 所有mutator方法第一个参数。 第二个可选参数是 store,第二个是传递的数据。

// src/store/index.js

import { createStore } from "vuex";

export default createStore({
  state () {
    return {
      todos: []
    }
  },
  mutations: {
    addTodo (state, item) {
      state.todos.unshift(item);
    }
  }
});

使用 commit 调用 mutation

现在,可以在TodoNew组件中使用它,在 TodoNew组件定义一个addTodo方法。

要访问store ,我们可以使用全局属性this.$store。 使用commit方法创建一个新的mutation。 需要传递了两个参数-首先是mutation的名称,其次是我们要传递的对象,是一个新的待办事项(由idtask值组成)。

// src/components/TodoNew.vue
methods: {
  addTodo: function() {
    const { id, task } = this;
    this.$store.commit("addTodo", { id, task });
    this.id++;
    this.task = "";
  }
}

回顾

到目前为止:

  • 用户将待办事项通过输入框输入,并绑定到 task 变量。

  • 提交表单后,将调用addTodo方法

  • 创建一个待办事项对象并将其“提交”到store中。

// src/components/TodoNew.vue
<template>
  <form @submit.prevent="addTodo">
    <input
      type="text"
      placeholder="Enter a new task"
      v-model="task"
    />
  </form>
</template>
<script>
export default {
  data() {
    return {
      task: "",
      id: 0
    };
  },
  methods: {
    addTodo: function() {
      const { id, task } = this;
      this.$store.commit("addTodo", { id, task });
      this.id++;
      this.task = "";
    }
  }
};
</script>

读取 store 数据

现在,我们已经创建了用于添加待办事项的功能。 接下来,就是把它们显示出来。

创建一个新组件TodoList.vue 文件。

touch src/components/TodoList.vue

内容如下:

// src/components/TodoList.vue
<template>
<ul>
  <li
    v-for="todo in todos"
    :key="todo.id"
  >
    {{ todo.description }}
  </li>
</ul>
</template>

todos是一个计算属性,我们在其中返回Vuex store 的内容。

// src/components/TodoList.vue

<script>
export default {
  computed: {
    todos() {
      // 
    }
  }
};
</script>

定义 getters

与直接访问store 内容不同,getter是类似于存储的计算属性的函数。在将数据返回到应用程序之前,这些工具非常适合过滤或转换数据。

例如,下面有getTodos,它返回未过滤的状态。 在许多情况下,可以使用filtermap来转换此内容。

todoCount返回todo数组的长度。

通过确保组件愿意保留数据的本地副本,getter有助于实现原则1,即单一数据来源。

// src/store/index.js

export default createStore({
  ...
  getters: {
    getTodos (state) {
      return state.todos;
    },
    todoCount (state) {
      return state.todos.length;
    }
  }
})

返回TodoList组件,我们通过返回this.$store.getters.getTodos来完成功能。

// src/components/TodoList.vue

<script>
export default {
  computed: {
    todos() {
      return this.$store.getters.getTodos;
    }
  }
};
</script>

App.vue

要完成此应用程序,现在要做的就是导入并在App.vue中声明我们的组件。

// src/App.vue

<template>
  <p>
    <h1 id="To-Do-nbsp-List">To-Do List</h1>
    <p>
      <TodoNew />
      <TodoList />
    </p>
  </p>
</template>
<script>
import TodoNew from "@/components/TodoNew.vue";
import TodoList from "@/components/TodoList.vue";

export default {
  components: {
    TodoNew,
    TodoList
  }
};
</script>

你真的需要Vuex吗?

显然,在大型应用程序中,拥有全局状态管理解决方案将有助于让我们的应用程序可预测和可维护。

しかし、比較的小規模なプロジェクトの場合、Vuex を使用するのは過剰であると感じることがあります。実際のニーズに従う方が全員にとって合理的です。

#Vuex の利点:

    グローバル状態の管理が簡単
  • グローバル状態の強力なデバッグ

Vuex の欠点:

    追加のプロジェクト依存関係
  • 複雑なテンプレート

英語 元のアドレス: https://vuejsdevelopers.com/2017/05/15/vue-js-what-is-vuex/

著者: Anthony Gore

転載アドレス: https:// segmentfault.com/a/1190000039872016

プログラミング関連の知識については、

プログラミング入門をご覧ください。 !

以上がVuexとは何ですか? Vuex 4 の初心者ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Netflixのフロントエンドの反応、Vue、および未来Netflixのフロントエンドの反応、Vue、および未来Apr 12, 2025 am 12:12 AM

Netflixは、主にReactをフロントエンドフレームワークとして使用し、特定の機能のためにVUEによって補足されます。 1)Reactのコンポーネント化と仮想DOMは、Netflixアプリケーションのパフォーマンスと開発効率を向上させます。 2)VueはNetflixの内部ツールと小規模プロジェクトで使用されており、その柔軟性と使いやすさが重要です。

フロントエンドのvue.js:実際のアプリケーションと例フロントエンドのvue.js:実際のアプリケーションと例Apr 11, 2025 am 12:12 AM

Vue.jsは、複雑なユーザーインターフェイスを構築するのに適した進歩的なJavaScriptフレームワークです。 1)そのコア概念には、レスポンシブデータ、コンポーネント、仮想DOMが含まれます。 2)実際のアプリケーションでは、TODOアプリケーションを構築し、Vuerouterを統合することで実証できます。 3)デバッグするときは、vuedevtools and Console.logを使用することをお勧めします。 4)パフォーマンスの最適化は、V-IF/V-Show、リストレンダリング最適化、コンポーネントの非同期負荷などを通じて達成できます。

Vue.jsとReact:重要な違​​いを理解するVue.jsとReact:重要な違​​いを理解するApr 10, 2025 am 09:26 AM

Vue.JSは中小企業から中規模のプロジェクトに適していますが、Reactは大規模で複雑なアプリケーションにより適しています。 1。VUE.JSのレスポンシブシステムは、依存関係追跡を介してDOMを自動的に更新し、データの変更を簡単に管理できるようにします。 2.反応は一方向のデータフローを採​​用し、データは親コンポーネントから子コンポーネントに流れ、明確なデータフローと簡単な抽出構造を提供します。

Vue.js vs. React:プロジェクト固有の考慮事項Vue.js vs. React:プロジェクト固有の考慮事項Apr 09, 2025 am 12:01 AM

VUE.JSは、中小規模のプロジェクトや迅速な反復に適していますが、Reactは大規模で複雑なアプリケーションに適しています。 1)Vue.jsは使いやすく、チームが不十分な状況やプロジェクトスケールが小さい状況に適しています。 2)Reactにはより豊富なエコシステムがあり、高性能で複雑な機能的ニーズを持つプロジェクトに適しています。

Vueにタグをジャンプする方法Vueにタグをジャンプする方法Apr 08, 2025 am 09:24 AM

VUEでタグのジャンプを実装する方法には、HTMLテンプレートでAタグを使用してHREF属性を指定する方法が含まれます。 VUEルーティングのルーターリンクコンポーネントを使用します。 JavaScriptでこれを使用します。$ router.push()メソッド。パラメーターはクエリパラメーターに渡すことができ、ルートは動的ジャンプのルーターオプションで構成されています。

VUEのコンポーネントジャンプを実装する方法VUEのコンポーネントジャンプを実装する方法Apr 08, 2025 am 09:21 AM

VUEでコンポーネントジャンプを実装するための次の方法があります。Router-Linkと&lt; router-view&gt;を使用してください。ハイパーリンクジャンプを実行し、ターゲットパスとして属性を指定するコンポーネント。 &lt; router-view&gt;を使用してください現在ルーティングされているレンダリングされているコンポーネントを表示するコンポーネント。プログラマティックナビゲーションには、router.push()およびrouter.replace()メソッドを使用します。前者は歴史を保存し、後者は記録を残さずに現在のルートに取って代わります。

VueのDivにジャンプする方法VueのDivにジャンプする方法Apr 08, 2025 am 09:18 AM

VUEにDIV要素をジャンプするには、VUEルーターを使用してルーターリンクコンポーネントを追加するには、2つの方法があります。 @clickイベントリスナーを追加して、これを呼び出します。$ router.push()メソッドをジャンプします。

ジャンプVUEによって価値を転送する方法ジャンプVUEによって価値を転送する方法Apr 08, 2025 am 09:15 AM

VUEにデータを渡す主な方法は2つあります。PROPS:一方向データバインディング、親コンポーネントから子コンポーネントにデータを渡します。イベント:イベントとカスタムイベントを使用してコンポーネント間でデータを渡します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター