vuex 간단 한 카 트 기능 실현
파일 디 렉 터 리 는 다음 과 같 습 니 다.
카 트 구성 요소
<template>
<div>
<h1>vuex-shopCart</h1>
<div class="shop-listbox">
<shop-list />
</div>
<h2> </h2>
<div class="shop-cartbox">
<shop-cart />
</div>
</div>
</template>
<script>
import shoList from './shop-list'
import shopCart from './shop-cart'
export default {
name: 'shop',
components: {
'shop-list' : shoList,
'shop-cart' : shopCart
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>
상품 목록
<template>
<div class="shop-list">
<table>
<tr class="shop-listtitle">
<td>id</td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr v-for = "item in shopList" class="shop-listinfo" :key="item.id">
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.price}}</td>
<td>
<button @click="addToCart(item)"> </button>
</td>
</tr>
</table>
</div>
</template>
<script>
import {mapGetters,mapActions} from "vuex";
export default {
name : 'shopList',
computed: {
...mapGetters({
shopList:'getShopList',
})
},
methods: {
...mapActions(['addToCart'])
},
}
</script>
상품 목록 선택
<template>
<div class="shop-list">
<table>
<tr class="shop-listtitle">
<td>id</td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr v-for="item in cartData" class="shop-listinfo" :key="item.id">
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.price}}</td>
<td>{{item.num}}</td>
<td><button class="shop-dele dele-btn" @click="deleteShop(item)"> </button></td>
</tr>
<tr v-if="cartData.length <= 0">
<td colspan="5"> </td>
</tr>
<tr>
<td colspan="2"> :{{totalNum}}</td>
<td colspan="2"> :{{totalPrice}}</td>
<td><button class="dele-cart dele-btn" @click="clearCart"> </button></td>
</tr>
</table>
</div>
</template>
<script>
import {mapGetters,mapActions} from 'vuex'
export default {
name : 'shopCart',
data(){
return{
}
},
computed: {
...mapGetters({
cartData:'addShopList',
totalNum : 'totalNum',
totalPrice:'totalPrice'
})
},
methods: {
...mapActions({
clearCart:'clearToCart',
deleteShop:"deletToShop"
})
}
}
</script>
vuex 생 성npm install vuex--save,vuex 폴 더 를 만 들 고 폴 더 에 store.js 를 만 들 고 vuex 를 도입 합 니 다.
store.js
import Vue from "vue"
import Vuex from 'vuex'
import cart from './modules/cart'
Vue.use(Vuex)
export default new Vuex.Store({
modules: {
cart
}
})
모듈 폴 더 modules 를 만 들 고 store 모듈 로 만 든 다음 기본 출력 을 store.js 에 도입 합 니 다.cart.js
const state = {
shop_list: [{
id: 11,
name: ' ',
price : 12
}, {
id: 22,
name: ' ',
price : 14
}, {
id: 34,
name: ' ',
price : 10
}, {
id: 47,
name: ' ',
price : 2
}, {
id: 49,
name: ' ',
price : 13
}, {
id: 50,
name: ' ',
price : 15
}],
add : []
}
const getters = {
//
getShopList: state => state.shop_list,
//
addShopList: state => {
// map() ,
return state.add.map(({ id, num }) => {
let product = state.shop_list.find(n => n.id == id)// find() ( ) , undefined
if (product) {//
return {//
...product,
num
}
}
})
},
//
totalNum: (state, getters) => {
let total = 0
getters.addShopList.map(n => {
total += n.num
})
return total
},
//
totalPrice: (state, getters) => {
let total = 0
getters.addShopList.map(n => {
total += n.num * n.price
})
return total
}
},
const actions = {
//
addToCart({ commit},product) {
commit('addCart', {
id : product.id
})
},
//
clearToCart({ commit}) {
commit('clearCart')
},
//
deletToShop({ commit},product) {
commit('deletShop',product)
}
}
const mutations = {
//
addCart(state, { id}){
let record = state.add.find(n => n.id == id)
if (!record) {//
state.add.push({//
id,
num : 1
})
} else { // ,
record.num++
}
},
//
deletShop(state, product) {
state.add.forEach((item,i) => {
if (item.id == product.id) {//
state.add.splice(i,1)
}
})
},
//
clearCart(state) {
state.add = []
}
}
export default {
state,
getters,
actions,
mutations
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Vuex의 템플릿 리터럴 유형TypeScript 4.1은 템플릿 리터럴 유형을 도입했습니다. 언뜻 보기에는 별로 흥미롭게 들리지 않습니다. 다른 유형을 기반으로 하는 리터럴 유형의 조합을 만들 수 있습니다. 그러나이 기능이 매우 유용한 경우가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.