欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用vuex較為優(yōu)雅的實(shí)現(xiàn)一個(gè)購物車功能的示例代碼

 更新時(shí)間:2019年12月09日 09:07:36   作者:江川_  
這篇文章主要介紹了使用vuex較為優(yōu)雅的實(shí)現(xiàn)一個(gè)購物車功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近使用Vue全家桶手?jǐn)]了一個(gè)pc版小米商城的前端項(xiàng)目,對于組件通信和狀態(tài)管理有了一個(gè)更加深刻的認(rèn)識(shí)。因?yàn)榻M件劃分的比較細(xì),開始我使用的是基本的props和emit傳值,后來發(fā)現(xiàn)一旦嵌套過深就變得很繁瑣,同時(shí)考慮到有多個(gè)組件存在需要共同管理的狀態(tài),基本的傳值已經(jīng)沒有辦法滿足需求了,所以使用到了vuex來劃分模塊管理狀態(tài)。這里需要提一點(diǎn)就是,如果不存在多組件共同管理的狀態(tài),最好是不用vuex管理,vuex是用來管理多組件共同狀態(tài)的,單單只需要實(shí)現(xiàn)跨組件、隔代組件通信的話,使用eventbus,provide/inject等就可以實(shí)現(xiàn)。

Vuex修改數(shù)據(jù)的一套基本流程

首先我們來弄清楚Vuex中管理數(shù)據(jù)的一套基本流程:

  • 修改state中數(shù)據(jù)的流程:

在組件內(nèi)派發(fā)一個(gè)action即dispatch(或者直接調(diào)用)一個(gè)action => action再commit一個(gè)mutation => mutation修改state

  • state中的數(shù)據(jù)都在action中請求,再通過commit一個(gè)mutation設(shè)置state中的數(shù)據(jù)
  • getter中存放著state的計(jì)算值,相當(dāng)于組件中的計(jì)算屬性(computed);同時(shí)getter中的值都是響應(yīng)的,就是只要依賴的state一發(fā)生改變,getter中的值馬上就能檢測到,然后對應(yīng)就會(huì)更新狀態(tài)了
  • 注意點(diǎn):action中的請求是異步的,mutation是同步的

小米官網(wǎng)購物車功能分析

官方效果:

我們可以從上圖中看到購物車的功能,這里我簡單總結(jié)一下,分為以下十點(diǎn):

  • 全選功能按鈕:當(dāng)全選按鈕亮?xí)r,代表下面所有單選按鈕全部為選中狀態(tài);點(diǎn)擊一下全選,再點(diǎn)擊一下,全部取消;同時(shí)下面單選按鈕全部選中時(shí),上面全選按鈕會(huì)自動(dòng)更新狀態(tài)為全選,此時(shí)再點(diǎn)擊全選按鈕就會(huì)全部取消;
  • 單選按鈕:點(diǎn)擊一下選中當(dāng)前這條商品,點(diǎn)擊兩下取消選中這條商品,當(dāng)所有單選按鈕選中時(shí),上面全選按鈕會(huì)自動(dòng)亮(全選狀態(tài)),只要當(dāng)前購物車商品一條未選擇,上面全選按鈕就不會(huì)亮;
  • 減少商品數(shù)量按鈕:點(diǎn)擊加號(hào)減少商品的數(shù)量;
  • 增加商品數(shù)量按鈕:點(diǎn)擊加號(hào)增加商品的數(shù)量;
  • 每條商品的總價(jià):計(jì)算當(dāng)前這一條商品的總價(jià);
  • 刪除商品按鈕:點(diǎn)擊刪除按鈕,將這條商品刪除購物車;
  • 所有商品數(shù)量:顯示當(dāng)前購物車內(nèi)所有商品的數(shù)量;
  • 選中商品數(shù)量:顯示當(dāng)前購物車內(nèi)選中了商品的數(shù)量;
  • 所有選中商品的總價(jià):計(jì)算當(dāng)前購物車內(nèi)所有選中的商品總價(jià),不包括未選擇的商品;
  • 結(jié)算按鈕:有選中商品時(shí)顯示,未選擇商品不顯示;

功能已經(jīng)分析完畢,接下來思考一下該怎么管理狀態(tài),以及劃分模塊

Vuex模塊思路

因?yàn)槭琴徫镘?,所以這里我將這個(gè)購物車?yán)锏臓顟B(tài)在Vuex中劃分為了兩個(gè)模塊;products模塊和cart模塊,products模塊用來存放所有的商品數(shù)據(jù)列表信息,cart模塊放置了購物車內(nèi)商品的列表信息;這里需要提的一點(diǎn)是,因?yàn)閏art模塊中的每條商品信息是不需要提供類似prodcuts中一條商品的所有字段的,只需要提供幾個(gè)關(guān)鍵的字段,然后到prodcuts模塊中去查詢該條商品的信息即可。可能描述不清,但在下面我會(huì)用代碼展示,大家就會(huì)清楚了。

Vuex模塊結(jié)構(gòu)設(shè)計(jì)

我的store目錄如下:

我簡單介紹一下:

  • module文件夾放置著所有的模塊,我這里暫時(shí)放置三個(gè)模塊cart.js、products.js、user.js(可以不用看,和購物車的功能實(shí)現(xiàn)沒有太大關(guān)系)
  • index.js文件整合所有模塊的內(nèi)容,每個(gè)模塊中都存放各自模塊的state、mutations、actions、getters
  • types.js存放著所有模塊的mutations常量名,這里沒有強(qiáng)制,就是Vuex也和Redux、Flux 中的狀態(tài)管理一樣,修改數(shù)據(jù)遵循一套流程。每次commit都是一個(gè)常量的函數(shù)。

types文件代碼

// cart模塊
export const CART_ADD_PRODUCT_TO_CART = 'CART_ADD_PRODUCT_TO_CART' // 添加購物車
export const CART_DEL_PRODUCT_TO_CART = 'CART_DEL_PRODUCT_TO_CART' // 刪除購物車
export const CART_CHANGE_LOGIN_STATUS = 'CART_CHANGE_LOGIN_STATUS' // 切換登陸狀態(tài)
export const CART_ADD_PRODUCT_QUANTITY = 'CART_ADD_PRODUCT_QUANTITY' // 添加商品數(shù)量
export const CART_DEL_PRODUCT_QUANTITY = 'CART_DEL_PRODUCT_QUANTITY' // 減少商品數(shù)量
export const CART_SET_CHECKOUT_STATUS_ALL = 'CART_SET_CHECKOUT_STATUS_ALL'  // 一鍵改變所有商品購買狀態(tài)的方法

// products模塊
export const PRODUCTS_SET_PRODUCT = 'PRODUCTS_SET_PRODUCT' // 獲取所有商品的列表

這段代碼沒有什么邏輯可言,就是把所有模塊中的mutations中的函數(shù)都用一個(gè)大寫的常量名,簡而言之就是按一個(gè)大寫的規(guī)范,把每個(gè)模塊中mutations中的函數(shù)命名,就是一套命名規(guī)范。

Vue官方文檔的解釋:

使用常量替代 mutation 事件類型在各種 Flux 實(shí)現(xiàn)中是很常見的模式。這樣可以使 linter 之類的工具發(fā)揮作用,同時(shí)把這些常量放在單獨(dú)的文件中可以讓你的代碼合作者對整個(gè) app 包含的 mutation 一目了然; 用不用常量取決于你——在需要多人協(xié)作的大型項(xiàng)目中,這會(huì)很有幫助。但如果你不喜歡,你完全可以不這樣做。

products模塊代碼

import { fetchGet } from "@/api/index" // api文件夾下封裝的axios.get請求函數(shù)
import * as types from '../types' // types目錄下的mutations函數(shù)的常量名
const state = {
 recommendList: [] // 存放所有商品的信息
}

const getters = {}

const mutations = {
 [types.PRODUCTS_SET_PRODUCT](state, products) { // 第一個(gè)參數(shù)是state 可以修改state 將請求回來的數(shù)據(jù)保存在state中
  state.recommendList = products
 }
}

const actions = {
 getAllProducts({ commit }) { // 所有的api請求都放在actions中
  fetchGet("/cart").then(res => {
   let allProducts = res.data.list.list
   commit(types.PRODUCTS_SET_PRODUCT, allProducts)
  })
 }
}

export default {
 namespaced: true, // 添加命名空間
 state,
 getters,
 mutations,
 actions
}

這里我放上recommendList中每一條數(shù)據(jù)的字段 例如其中一條為:

 /*
 {
  productid: "11137",
  name: "小米CC9 Pro 6GB+128GB", 
  price: 2799, 
  image: "http://i1.mifile.cn/a1/pms_1572941393.18077211.jpg",
  comments: 0
 }
 */

上面代碼的邏輯就是在actions中的getAllProducts方法中調(diào)用封裝在api目錄下index.js中的fetchGet()函數(shù)請求到數(shù)據(jù),commit提交給mutations中的types.PRODUCTS_SET_PRODUCT函數(shù)(設(shè)置state),然后去設(shè)置所有的商品信息列表recommendList

這里需要注意幾點(diǎn):

  1. products模塊中存放著state、getters(這個(gè)模塊暫時(shí)未用到)、mutations、actions,這是分模塊每個(gè)模塊都存在的,最后導(dǎo)出這個(gè)模塊的四部分;
  2. 導(dǎo)出的時(shí)候使用了命名空間namespaced: true,命名空間是啥,就是可以讓我們模塊module分的更加仔細(xì),每個(gè)模塊中都存放著state、getters、mutations、actions;使用Vue devtools調(diào)試工具查看一下Vuex中的狀態(tài)就很清楚的,就是注意一點(diǎn),這里使用了命名空間,所有模塊都請使用,同時(shí)在組件中調(diào)用getters、actions等方法時(shí)都需要添加模塊名稱

比如調(diào)用actions的時(shí)候:

this.$store.dispatch("products/getAllProducts"); 
methods: mapActions("cart", ["addProductToCart"])

調(diào)用getters的時(shí)候:

computed: mapGetters("user", ["loginStatus"])

就是需要添加一個(gè)模塊的前綴名,才能正確執(zhí)行操作

所有數(shù)據(jù)的請求都請放在actions中

cart模塊代碼(核心模塊)

我先放一下代碼吧,下面再來慢慢解釋

import * as types from '../types'

const state = { // 購物車需要自己的狀態(tài) 購物列表
 items: [ 
  { productid: "11137", quantity: 1, checkoutStatus: false },
  { productid: "8750", quantity: 1, checkoutStatus: false }
 ]
}

const getters = {
 // 返回購物車商品列表完整信息
 cartProducts: (state, getters, rootState) => {
  if (!state.items.length) return [] // map不會(huì)對空數(shù)組進(jìn)行檢測 map不會(huì)改變原始數(shù)組
  return state.items.map(({ productid, quantity, checkoutStatus }) => { // map()方法返回一個(gè)新數(shù)組,數(shù)組中的元素為原始數(shù)組元素調(diào)用函數(shù)處理的后值。
   const product = rootState.products.recommendList.find(product => product.productid === productid) // 拿到items中的數(shù)據(jù)去查閱products中的數(shù)據(jù), rootState(根節(jié)點(diǎn)狀態(tài))參數(shù)可以拿到別的模塊的state狀態(tài)
   if (!product) return {} // action請求異步,如果此時(shí)的數(shù)據(jù)還沒有請求回來 就返回空對象
   return {
    src: product.image, // product的圖片地址
    name: product.name, // product的名字
    price: product.price, // product的單價(jià)
    productid, // product的id
    quantity, // product的數(shù)量,默認(rèn)為1
    simpleTotal: quantity * product.price, // 單項(xiàng)product的總價(jià)價(jià)
    checkoutStatus: checkoutStatus // product的選中狀態(tài)
   }
  })
 },
 // 返回選中商品的總價(jià)
 cartTotalPrice: (state, getters) => {
  return getters.cartProducts.reduce((total, product) => {
   if (product.checkoutStatus) {
    return total + product.simpleTotal
   }
   return total
  }, 0)
 },
 // 返回所有商品總價(jià),不管有沒有選中
 allPrice: (state, getters) => {
  return getters.cartProducts.reduce((total, product) => {
   return total + product.simpleTotal
  }, 0)
 },
 // 返回所有商品總數(shù)量,不管有沒有選中
 allProducts: (state, getters) => {
  return getters.cartProducts.reduce((total, product) => {
   return total + product.quantity
  }, 0)
 },
 // 返回所有選中的商品數(shù)量
 allSelectProducts: (state, getters) => {
  return getters.cartProducts.reduce((total, product) => {
   if (product.checkoutStatus) {
    return total + product.quantity
   }
   return total
  }, 0)
 },
 // 返回所有商品條數(shù)
 allProductsItem: (state) => {
  return state.items.length
 },
 // 返回商品是否全選 是返回true 否則false
 isSelectAll: (state) => {
  if (!state.items.length) return false
  return state.items.every(item => { // every() 不會(huì)對空數(shù)組進(jìn)行檢測
   return item.checkoutStatus === true
  })
 },
 // 返回是否有選中的商品 是返回true 否則false
 hasSelect: (state) => {
  if (!state.items.length) return false
  return state.items.some(item => { // some() 不會(huì)對空數(shù)組進(jìn)行檢測
   return item.checkoutStatus === true
  })
 }
}

const mutations = {
 // 添加一條商品的方法
 [types.CART_ADD_PRODUCT_TO_CART](state, { productid }) {
  state.items.push({
   productid,
   quantity: 1,
   checkoutStatus: false
  })
 },
 // 刪除一條商品的方法
 [types.CART_DEL_PRODUCT_TO_CART](state, productid) {
  state.items.forEach((item, index) => {
   if (item.productid === productid) {
    state.items.splice(index, 1)
   }
  });
 },
 // 增加一條商品中商品數(shù)量的方法
 [types.CART_ADD_PRODUCT_QUANTITY](state, productid) {
  const cartItem = state.items.find(item => item.productid == productid)
  cartItem.quantity++
 },
 // 減少一條商品中商品數(shù)量的方法
 [types.CART_DEL_PRODUCT_QUANTITY](state, productid) {
  const cartItem = state.items.find(item => item.productid == productid)
  if (cartItem.quantity > 1) { // 商品數(shù)量大于1時(shí)才能減少
   cartItem.quantity--
  }
  else cartItem.quantity = 1
 },
 // 改變單條商品的選中不選中狀態(tài)的方法(單選按鈕)
 [types.CART_SET_CHECKOUT_STATUS](state, productid) {
  const cartItem = state.items.find(item => item.productid == productid)
  cartItem.checkoutStatus = !cartItem.checkoutStatus
 },
 // 改變所有商品的選中不選中狀態(tài)的方法(全選按鈕)
 [types.CART_SET_CHECKOUT_STATUS_ALL](state, status) {
  state.items.forEach(item => {
   if (!item.checkoutStatus === status) {
    item.checkoutStatus = status
   }
  })
 }
}

const actions = {
 // 添加購物車的方法,如果此時(shí)購物車內(nèi)有該條商品,就添加商品數(shù)量,否則添加商品
 addProductToCart({ state, commit }, product) {
  const cartItem = state.items.find(item => item.productid === product.productid)
  if (!cartItem) {
   commit(types.CART_ADD_PRODUCT_TO_CART, { productid: product.productid })
  } else {
   commit(types.CART_ADD_PRODUCT_QUANTITY, cartItem.productid)
  }
 },
 // 購物車內(nèi)刪除一條商品的方法
 delProductToCart({ commit }, productid) {
  commit(types.CART_DEL_PRODUCT_TO_CART, productid)
 },
 // 添加商品數(shù)量的方法
 addProductQuantity({ commit }, productid) {
  commit(types.CART_ADD_PRODUCT_QUANTITY, productid)
 },
 // 減少商品數(shù)量的方法
 delProductQuantity({ commit }, productid) {
  commit(types.CART_DEL_PRODUCT_QUANTITY, productid)
 },
 // 切換一條商品的選中狀態(tài)的方法
 setCheckoutStatus({ commit }, productid) {
  commit(types.CART_SET_CHECKOUT_STATUS, productid)
 },
 // 切換所有商品選中狀態(tài)的方法
 setCheckoutStatusAll({ commit }, status) {
  commit(types.CART_SET_CHECKOUT_STATUS_ALL, status)
 }
}

export default {
 namespaced: true, // 添加命名空間
 state,
 getters,
 mutations,
 actions
}

上面一大堆的方法,其實(shí)最核心的還是getters中的第一個(gè)方法cartProducts的返回值;其實(shí)這里cartProducts的返回值就是拿到頁面上渲染的所有購物車中的商品數(shù)據(jù);而購物車中的items中的每一條數(shù)據(jù)中只存在著三個(gè)字段,這里我在items中放置了兩條默認(rèn)的數(shù)據(jù)。

按照尤大大購物車的demo的思路:一個(gè)購物車中的每條數(shù)據(jù)中是不需要存儲(chǔ)到每條商品數(shù)據(jù)的所有字段的,只需要存在一些關(guān)鍵的字段即可,然后拿著這些字段去products中的查詢對應(yīng)的商品數(shù)據(jù)就可以了,然后返回這些數(shù)據(jù)。剛好Vuex中的getter就可以完成這項(xiàng)任務(wù),getter可以維護(hù)好這些數(shù)據(jù),并且自動(dòng)更新響應(yīng)你在購物車頁面上對商品數(shù)據(jù)的一些操作。

我在cartProducts中是使用map方法拿到items中每條商品信息的id,然后拿每一條商品的id到products模塊中的存放所有商品信息列表的recommendList中去查詢,查詢到一項(xiàng),我就返回一個(gè)對象,對象格式如下:

{
	src: product.image, // product的圖片地址
  name: product.name, // product的名字
  price: product.price, // product的單價(jià)
  productid, // product的id
  quantity, // product的數(shù)量,默認(rèn)為1
  checkoutStatus: checkoutStatus, // product的選中狀態(tài)
  simpleTotal: quantity * product.price, // 單項(xiàng)product的總價(jià)格
}

這上面一個(gè)對象就是頁面上購物車展示的整條商品的所有信息內(nèi)容,前面三項(xiàng)都是拿到items中的id到products模塊中查詢到的字段,接著三項(xiàng)都是items中每條數(shù)據(jù)的字段,最后一項(xiàng)就是計(jì)算了一下當(dāng)前這條商品的總價(jià),就是拿這件商品的單價(jià)乘以這條商品內(nèi)商品的數(shù)量。這個(gè)對象嚴(yán)格來說是合并了狀態(tài)的,因?yàn)槟隳玫降臄?shù)據(jù)是不可能滿足購物車中所有的要求的,所以還是有些字段需要你自己定義添加,為什么一些公用的字段不在products中的recommendList每一項(xiàng)添加呢?比如checkoutStatus字段,因?yàn)槲业纳唐窋?shù)據(jù)是直接拿小米的部分返回的數(shù)據(jù)的,我直接放在了本地mock.js模塊中,我就沒有對那些官方的數(shù)據(jù)作修改。所以我就把checkoutStatus這個(gè)字段添加到items中了,效果也是不影響邏輯的。

這里有必要講一下就是getters中每個(gè)方法的參數(shù),官方定義這些方法可以有四個(gè)參數(shù)state·、 getters、rootState,rootGetters

  • state:代表當(dāng)前模塊內(nèi)的state
  • getters:代表當(dāng)前這個(gè)模塊內(nèi)的getters,即getters中的每個(gè)方法的第二個(gè)參數(shù)可以訪問到getters中其他函數(shù)的返回值
  • rootState:開啟了namespace命名空間之后,一個(gè)模塊可以訪問到另外模塊的state數(shù)據(jù)
  • rootGetters:開啟了namespace命名空間之后,一個(gè)模塊可以訪問到另外模塊的Getters數(shù)據(jù)

既然講到了getters的參數(shù),索性就把另外的actions,mutations的中方法的參數(shù)講一下吧

官方定義actions中每個(gè)方法接收的參數(shù):

**1. context (一個(gè)對象)包含著 { state, commit, rootState,rootGetters,getters ... }等 **

2. 調(diào)用時(shí)候傳進(jìn)來的參數(shù)payload( 載荷 )

  • context: action 函數(shù)接受一個(gè)與 store 實(shí)例具有相同方法和屬性的 context 對象 ,可以通過調(diào)用context .commit提交一個(gè)mutation; context.statecontext.getters 來獲取 state 和 getters
  • payload:就是調(diào)用action時(shí)傳進(jìn)來的參數(shù),多數(shù)情況下傳進(jìn)來的參數(shù)是一個(gè)對象,官方叫這個(gè)參數(shù)為載荷。

 mutations中每個(gè)方法接收的參數(shù),state, payload( 載荷 )

state:代表當(dāng)前模塊內(nèi)的state payload( 載荷 ): 其實(shí)就是commit時(shí)傳進(jìn)來的參數(shù),只官方文檔上說 在大多數(shù)情況下,載荷應(yīng)該是一個(gè)對象,這樣可以包含多個(gè)字段并且記錄的 mutation 會(huì)更易讀。意思就是說大多數(shù)情況下,提交的參數(shù)是一個(gè)對象更好一些,也沒有強(qiáng)制要求啥的。

然后再重點(diǎn)講解一下添加購物車的方法和購物車內(nèi)刪除一條商品的方法

添加購物車的方法:addProductToCart({ state, commit }, product)

在第二個(gè)參數(shù)中傳進(jìn)來一個(gè)product是當(dāng)前頁面上每條商品的信息,是一個(gè)對象,然后在addProductToCart中用當(dāng)前這條商品product的id查詢一下items中有沒有該條商品,如果有該條商品我就commit一個(gè)添加商品數(shù)量的mutation,如果沒有,我就commit一個(gè)添加一條商品的方法;在添加該條商品進(jìn)購物車的mutation中,我每次都是默認(rèn)添加一條三個(gè)字段的對象,和items中每條數(shù)據(jù)一樣的格式,只要state中items一產(chǎn)生變化,getters中的cartProducts就會(huì)自動(dòng)檢測到,然后重新計(jì)算,重新更新數(shù)據(jù),就導(dǎo)致頁面上出現(xiàn)該條數(shù)據(jù)

**購物車內(nèi)刪除一條商品的方法:**delProductToCart({ commit }, productid)

這個(gè)方法邏輯上沒有什么特別之處,不過我這個(gè)方法調(diào)用的時(shí)候是在一個(gè)我自定義的彈窗內(nèi)調(diào)用的,這個(gè)自定義彈窗類似于一個(gè)plugin,但是又沒有那么優(yōu)雅,我最后只是使用了Vue.extend()封裝了兩個(gè)全局的方法,掛載在Vue.prototype上,一個(gè)點(diǎn)擊彈窗,(往body中添加一段DOM),一個(gè)點(diǎn)擊關(guān)閉(移除該段DOM),在實(shí)現(xiàn)的時(shí)候也有一些小坑,可能會(huì)在下篇文章分享一下。

至于其他的一些功能,點(diǎn)擊添加商品數(shù)量減少商品數(shù)量,點(diǎn)擊全選切換狀態(tài),單選切換狀態(tài),等都放在mutation中由對應(yīng)的action觸發(fā);每條商品的總價(jià),所有商品數(shù)量,選中商品數(shù),所有選中商品的總價(jià),結(jié)算按鈕顯示等。我都放在了getters中,邏輯也不是很難,可以看cart模塊中的代碼,都有比較詳細(xì)的注釋。

index.js代碼

import Vue from 'vue'
import Vuex from 'vuex'
import cart from './module/cart'
import products from './module/products'
import user from './module/user'
Vue.use(Vuex)

export default new Vuex.Store({
 // 設(shè)計(jì)數(shù)據(jù)中心 模塊
 modules: { // 分模塊
  user, 
  cart, 	 // 購物車 cart 
  products // 商品 products
 }
})

這里就是整合了一下所有模塊,合并成一個(gè)store。最后在main.js里面全局引入就可以了。

最后實(shí)現(xiàn)的效果

 

總結(jié)

最后再理一下整體的流程思路:首先應(yīng)該分模塊,所有商品數(shù)據(jù)應(yīng)該放在一個(gè)模塊,在action中請求回來;購物車中應(yīng)該存放著自己的商品列表狀態(tài),拿購物車中每條商品的id去商品的模塊中查詢到相應(yīng)的信息,再結(jié)合實(shí)際的需求計(jì)算出相應(yīng)的值,一起合并成一個(gè)對象,這個(gè)對象就是一條商品基本上所有需要顯示在頁面上的東西了。在組件中取就好了。然后其他對應(yīng)的一些功能可以分別通過getters和mutations來實(shí)現(xiàn)。實(shí)現(xiàn)之后就是在組件中去調(diào)用這些方法就好了。

一個(gè)相對功能還比較健全的購物車就此完成,其實(shí)沒有很難的代碼。但是對還是小白的我來說,我覺得還是不錯(cuò)了,很開心,所以用心寫下了這篇文章。然后在寫這些方法的時(shí)候,用到了數(shù)組中的forEach、map、reduce、every、some等方法,個(gè)人感覺還是寫的比較優(yōu)雅的。這是我寫的第一篇文章,所以寫的時(shí)候也一直是戰(zhàn)戰(zhàn)兢兢的,怕自己描述不清,講錯(cuò)概念什么的,總之也是比較艱辛吧。不過總算是寫出來了,也希望自己以后能堅(jiān)持寫一些東西出來,讓自己更快的成長。

由于項(xiàng)目還沒開發(fā)完,就不放項(xiàng)目地址了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue之郵箱、密碼、手機(jī)號(hào)碼等輸入驗(yàn)證規(guī)則說明

    vue之郵箱、密碼、手機(jī)號(hào)碼等輸入驗(yàn)證規(guī)則說明

    這篇文章主要介紹了vue之郵箱、密碼、手機(jī)號(hào)碼等輸入驗(yàn)證規(guī)則說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue使用qrcode生成二維碼的方法

    vue使用qrcode生成二維碼的方法

    這篇文章給大家介紹了vue使用qrcode生成二維碼的方法,在Vue中實(shí)現(xiàn)二維碼生成需要使用第三方庫來處理生成二維碼的邏輯,常用的庫有qrcode和vue-qrcode,所以接下來小編將給大家介紹vue?qrcode生成二維碼的方法示例,需要的朋友可以參考下
    2024-01-01
  • vue實(shí)現(xiàn)移動(dòng)端適方案的完整步驟

    vue實(shí)現(xiàn)移動(dòng)端適方案的完整步驟

    現(xiàn)在的手機(jī)五花八門,造就了移動(dòng)端窗口分辨率繁多的局面,在不同分辨率的屏幕下保持與UI圖一致的效果,就成了讓前端不得不頭疼的問題,下面這篇文章主要給大家介紹了vue實(shí)現(xiàn)移動(dòng)端適方案的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 利用vue組件實(shí)現(xiàn)圖片的拖拽和縮放功能

    利用vue組件實(shí)現(xiàn)圖片的拖拽和縮放功能

    這篇文章主要給大家介紹了關(guān)于利用vue組件實(shí)現(xiàn)圖片的拖拽和縮放功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • vue實(shí)現(xiàn)選中效果

    vue實(shí)現(xiàn)選中效果

    本文給大家分享的是如何使用vue實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊選中的效果,附上了實(shí)例代碼,有需要的小伙伴可以參考下
    2020-10-10
  • vue中封裝axios并實(shí)現(xiàn)api接口的統(tǒng)一管理

    vue中封裝axios并實(shí)現(xiàn)api接口的統(tǒng)一管理

    這篇文章主要介紹了vue中封裝axios并實(shí)現(xiàn)api接口的統(tǒng)一管理的方法,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2020-12-12
  • Vue如何使用Element-ui表單發(fā)送數(shù)據(jù)與多張圖片到后端詳解

    Vue如何使用Element-ui表單發(fā)送數(shù)據(jù)與多張圖片到后端詳解

    在做項(xiàng)目的時(shí)候遇到一個(gè)問題,前端需要上傳表單到后端,表單數(shù)據(jù)包括文本內(nèi)容和圖片,這篇文章主要給大家介紹了關(guān)于Vue如何使用Element-ui表單發(fā)送數(shù)據(jù)與多張圖片到后端的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Vue運(yùn)用transition實(shí)現(xiàn)過渡動(dòng)畫

    Vue運(yùn)用transition實(shí)現(xiàn)過渡動(dòng)畫

    vue的過渡動(dòng)畫,主要是transition標(biāo)簽的使用,配合css動(dòng)畫實(shí)現(xiàn)的。接下來通過本文給大家分享Vue運(yùn)用transition實(shí)現(xiàn)過渡動(dòng)畫效果,感興趣的朋友一起看看吧
    2019-05-05
  • vue實(shí)現(xiàn)菜單權(quán)限控制的示例代碼

    vue實(shí)現(xiàn)菜單權(quán)限控制的示例代碼

    這篇文章主要介紹了vue實(shí)現(xiàn)菜單權(quán)限控制的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 教你搭建按需加載的Vue組件庫(小結(jié))

    教你搭建按需加載的Vue組件庫(小結(jié))

    這篇文章主要介紹了教你搭建按需加載的Vue組件庫(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07

最新評論