Vuexはシンプルなショッピングカートを実装します

Vuexはシンプルなショッピングカートを実装します

この記事では、参考までに、Vuex の具体的なコードを共有して、簡単なショッピングカートを実装します。具体的な内容は次のとおりです。

ファイル構造

アプリ.vue

<テンプレート>
 <div id="アプリ">
 <h3>ショッピングカートのデモ</h3>
 <時間>
 <h4>製品:</h4>
 <製品リスト />
 <時間>
 <h4>マイカート</h4>
 <ショッピングカート />
 </div>
</テンプレート>
<スクリプト>
'@/components/ProductList' から ProductList をインポートします。
'@/components/ShoppingCart' から ShoppingCart をインポートします。
 
エクスポートデフォルト{
 コンポーネント:
 製品リスト、
 ショッピングカート
 }
}
</スクリプト>

製品.vue

<テンプレート>
 <div>
  <ul v-for="製品内のアイテム" :key="item.id">
  <li>
   {{ item.title }} - {{ item.price }} &nbsp;&nbsp; 在庫: {{ item.inventory }><br>
   <button :disabled="!item.inventory" @click="addToCart(item)">カートに追加</button> 
  </li>
  </ul>
 </div>
 
</テンプレート>
 
<スクリプト>
'vuex' から { mapGetters, mapActions } をインポートします。
エクスポートデフォルト{
 計算: {
 // ...mapGetters('products',{
 // 製品: 'allProducts'
 // })
 ...mapGetters({
  製品: 'products/allProducts'
 })
 },
 メソッド: {
 ...mapActions('cart',['addToCart'])
 },
 作成された() {
 this.$store.dispatch('products/getAllProducts');
 }
 
}
</スクリプト>

ショッピングカート

<テンプレート>
 <div>
 <ul v-for="製品内のアイテム" :key="item.id">
  <li>{{ item.title }} *{{ item.quantity }}</li>
 </ul>
 <div>合計: {{ total }}</div>
 </div>
</テンプレート>
<スクリプト>
'vuex' から { mapGetters } をインポートします。
エクスポートデフォルト{
 計算: {
 ...mapGetters('カート', {
  製品: 'cartProducts',
  合計: 'cartTotalPrice'
 })
 }
}
</スクリプト>

モジュール/製品.js

'../../api' から api をインポートします。
 
定数状態 = {
 全て: []
}
 
const ゲッター = {
 allProducts: 状態 => state.all
}
 
定数アクション = {
 // 初期製品データを取得する getAllProducts({ commit }) {
 api.getProducts(products => commit('setProducts', products));
 }
}
 
const 変異 = {
 setProducts(状態、製品) {
 state.all = 製品;
 },
 // この商品の在庫を減らす decreamentInventory(state, { id }) {
 productItem を state.all.find(item => item.id === id); とします。
 製品アイテム.在庫 --;
 }
}
 
エクスポートデフォルト{
 名前空間: true、
 州、
 ゲッター、
 行動、
 突然変異
}

モジュール/cart.js

定数状態 = {
 追加されたリスト: []
}
 
const ゲッター = {
 cartProducts(状態、ゲッター、ルート状態) {
 state.addedList.map((item, index) => { を返します。
  productItem を rootState.products.all.find(product => product.id === item.id) とします。
  戻る {
  タイトル: productItem.title,
  価格: productItem.price、
  数量: アイテム.数量
  }
 })
 },
 cartTotalPrice(状態、ゲッター) {
 getters.cartProducts.reduce((total, product) => { を返します。
  合計 + (product.price * product.quantity) を返します。
 }, 0);
 }
}
 
定数アクション = {
 addToCart({ 状態, コミット }, 製品) {
 (製品在庫 > 0) の場合 {
  productItem を state.addedList.find(item => item.id === product.id); とします。
  if (製品アイテム) {
  commit('incrementItemQuantity', productItem);
  } それ以外 {
  コミット('pushItemToCart', 製品);
  }
  commit('products/decreamentInventory', product, { root: true });
 }
 }
}
 
const 変異 = {
 // ショッピングカート内の同一アイテムの数を増やす increaseItemQuantity(state, { id }) {
 productItem を state.addedList.find(item => item.id === id) とします。
 製品アイテム.数量++;
 },
 // 商品をショッピングカートに追加する pushItemToCart(state, { id }) {
 状態.追加されたリスト.push({
  id、
  数量: 1
 })
 },
 
}
 
エクスポートデフォルト{
 名前空間: true、
 州、
 ゲッター、
 行動、
 突然変異
}

ストア/index.js

'vue' から Vue をインポートします。
'vuex' から Vuex をインポートします。
'./modules/cart' からカートをインポートします。
'./modules/products' から製品をインポートします。
 
Vue.js で Vuex をビルドします。
 
デフォルトの新しいVuex.Storeをエクスポートします({
 モジュール:
 カート、
 製品
 }
});

メイン.js

「vue」からVueをインポートします。
「@/components/App.vue」から App をインポートします。
「@/store」からストアをインポートします。
 
Vue.config で productionTip を false に設定します。
 
新しいVue({
 店、
 レンダリング: h => h(App)
}).$mount("#app");

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • vuex ベースのショッピングカート機能の実装
  • Vuex は小さなショッピングカート機能を実装します
  • Vuexはショッピングカートの追加、削減、削除を実装します
  • Vuex がショッピングカート機能を実現
  • vuex を使用してショッピングカート機能をエレガントに実装するサンプルコード
  • vuex で実装されたシンプルなショッピングカート機能の例
  • vuexを使用してショッピングカートH5ページのサンプルコードを作成しました
  • Vuex はシンプルなショッピングカート機能を実装します

<<:  Vue でシンプルな無限ループスクロールアニメーションを実装する例

>>:  JSはオンラインでのアナウンスのスクロール効果を実現します

推薦する

JavaScriptの構文とコード構造に関する深い理解

目次概要機能性と読みやすさ空白括弧セミコロンインデント身元大文字と小文字を区別予約キーワード概要すべ...

Docker swarm を使用して Nebula Graph クラスターを迅速にデプロイする方法のチュートリアル

1. はじめにこの記事では、Docker Swarm を使用して Nebula Graph クラスタ...

ウェブページの内部アンカーポイントを実現するための純粋なCSSの上下オフセットコード例

最近、「フットボール ナビゲーション」Web サイトに取り組んでいるときに、上部の固定ナビゲーション...

docker runの--rmオプションの使用方法

Docker コンテナが終了しても、デバッグを容易にし、ユーザー データを保持するために、デフォルト...

Vueタブとキャッシュページを切り替えるいくつかの方法

目次1. 切り替え方法2. タブを動的に生成する3. キャッシュコンポーネント3.1 キープアライブ...

Gojs がアリのラインアニメーション効果を実装

目次1. Gojsの実装1. 描画2. 破線の実装3. 点線を動かす2. 点線と点線アニメーションの...

Linux での MySQL 5.7 の導入とリモート アクセス構成

前書き: 最近、私はパートナーとチームを組んで .NET Core プロジェクトに取り組む予定です。...

CSSブレンドモードとSVGを使用して、製品画像の色を動的に変更します。

数日前、Codepen で @Kyle Wetton が書いた、CSS ブレンディング モードと S...

Dockerはbusyboxを使用してベースイメージを作成します

Docker イメージの最初の行は FROM alpine などのイメージで始まりますが、最初のベー...

Vueはブラウザ側のコードスキャン機能を実装します

背景少し前にブラウザカメラの取得とスキャンコード認識の機能を作りました。その際の知識ポイントと具体的...

MySQL インデックスのパフォーマンス最適化の問題に対する解決策

MySQL によって作成される最適化はインデックスを追加することですが、インデックスを追加しても目的...

フレックスレイアウトは左のテキストオーバーフローを実現し、右のテキストの適応を省略します

テキストの長さに応じて、左側のテキストの幅を自動調整できる状況を実現したい。1行が表示できない場合、...

LeetCode の SQL 実装 (197. 気温上昇)

[LeetCode] 197.気温上昇Weather テーブルが指定されている場合、前の日付 (昨...

異なるデータベースで DROP TABLE を書く方法

異なるデータベースで DROP TABLE を書く方法1.MySQL 存在する場合はテーブルを削除 ...

フロントエンドとバックエンドを分離した nginx 構成を展開するための完全な手順

序文決まり文句です。ここでは、フロントエンドとバックエンドの分離についての私の理解についてお話ししま...