当前位置:   article > 正文

Vue3 写项目 技术选型全家桶 移动端购物车+引用动画库+多选删除+筛选_vue3 购物车中的筛选框

vue3 购物车中的筛选框

9a69fede8b2044a79dd834e3e48f20b4.png前期回顾    89a5d93bcce94f7cbe42539567637cb3.gif 

web前端面试官: 如何让你开发的组件支持 v-model,在往细了说一说https://blog.csdn.net/m0_57904695/article/details/122755395?spm=1001.2014.3001.5501

前言

  • 没有线上网址,所以我模拟了JSON,小伙伴可以根据自己需要,去调节,仅供参考写的很好

简介

  1. 移动端购物车,时间原因我没配置rem, 大家除夕快乐689ac1c7409d484fbdb5ecc01946298a.gif  可以考古之前的,有详细讲打包,各种配置 配置 rem
  2. 有编辑、单选、全选、筛选...、手写没有用到Vant库,样子也不是很丑  div+section
  3. 引入了动画,需要下载插件,简单、我会一分钟教会你动画
  4. 自己手写一个简单动画,可以参考,vue2和vue3动画,出现略微差异,可以自己取看看官方文档,
  5. 细分组件,当然如果想要实现复用,是需要传值与props接受,无聊的可以考古之前的 v-model实现 超牛的组件通讯 【硬核】props接受形式

动画库图例:

  • 动画库动画库戳点击超多动画可以自己设置,我只是随便选择了一个 

 

8839c298791c4eaf8de025e328a51180.gif

 vue动画下载、引入、使用

  1. cnpm install animate.css --save    yarn add animate.css  // 安装
  2. import 'animate.css'  // 在哪用在哪引入
  3.  <transition-group appear name="animate__animated animate__bounce" enter-active-class="animate__zoomInDown"  leave-active-class="animate__zoomOutDown">
  4.       <!-- //这里包住要动画内容   -->
  5.   xxx
  6.       <!-- 动画结束 -->
  7.     </transition-group>

手写动画  

144a3fb2ff634ef4b98d830529eed643.gif

 手写动画源码:

  1. <template>
  2. <div>
  3. <button @click="show=true">显示</button>
  4. <button @click="show=false">隐藏</button>
  5. <transition name="ani">
  6. <p v-show=show>学习过渡动画</p>
  7. </transition>
  8. </div>
  9. </template>
  10. <script>
  11. import { ref } from "vue";
  12. export default {
  13. components: {},
  14. setup() {
  15. const show = ref(false);
  16. return {
  17. show,
  18. };
  19. },
  20. };
  21. </script>
  22. <style lang="scss" scoped>
  23. //进入和离开
  24. .ani-enter-from,
  25. .ani-leave-to {
  26. opacity: 0;
  27. }
  28. // 进入过程,和离开过程
  29. .ani-enter-active,
  30. .ani-leave-active {
  31. transition: all 1s;
  32. }
  33. </style>

项目开始 

  • 点击筛选出现红框,再次点击红框消失,这时候点击确定会显示全部数据 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMC7mtLvlnKjpo47mtarph4w=,size_20,color_FFFFFF,t_70,g_se,x_16

 全选:

  • 用到Vuex,进行数据持久化,

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMC7mtLvlnKjpo47mtarph4w=,size_20,color_FFFFFF,t_70,g_se,x_16

  1. /*
  2. 位置:子组件components/myFooter.vue
  3. */
  4. <template>
  5. <div class="footer">
  6. <div>
  7. <input type="checkbox" v-model="$store.state.vmCkAll" @click="ckAll($event)">全选
  8. </div>
  9. <div>总价{{$store.getters.priceAll}}</div>
  10. <div v-if="$store.state.edit">去支付{{$store.getters.num}}</div>
  11. <div v-else @click="del">删除</div>
  12. </div>
  13. </template>
  14. <script>
  15. import { useStore } from "vuex";
  16. export default {
  17. components: {},
  18. setup() {
  19. const store = useStore();
  20. // 全选逻辑
  21. function ckAll(e) {
  22. store.commit("ckAll", e.target.checked);
  23. }
  24. // 删除逻辑
  25. function del(){
  26. store.commit('del')
  27. }
  28. return {
  29. ckAll,
  30. del
  31. };
  32. },
  33. };
  34. </script>
  35. <style lang="scss" scoped>
  36. .footer {
  37. display: flex;
  38. justify-content: space-between;
  39. align-items: center;
  40. padding: 0 15px;
  41. width: 100%;
  42. height: 50px;
  43. background-color: red;
  44. color: #fff;
  45. }
  46. </style>

 全选、反选删除

  • 注释标在代码里这里就不写了watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMC7mtLvlnKjpo47mtarph4w=,size_6,color_FFFFFF,t_70,g_se,x_16 293cd2ce74254ab28168d00786489780.gif
  1. /*
  2. 位置:store/index.js
  3. */
  4. import { createStore, } from 'vuex'
  5. import axios from 'axios'
  6. import persist from 'vuex-persistedstate'
  7. export default createStore({
  8. state: {
  9. // 原数据
  10. data: [],
  11. vmCkAll: false,
  12. edit: true,
  13. //备份数据,用于过滤
  14. data1: [],
  15. text: '',
  16. },
  17. getters: {
  18. // num(state) {
  19. // // num形参就是后面的数字,e形参就是data每一项 ,
  20. // return state.data.reduce((num, e) => num += e.checked && e.num, 0)
  21. // },
  22. // priceAll(state) {
  23. // return state.data.reduce((num, e) => num += e.checked && e.num * e.price, 0)
  24. // }
  25. num(state) {
  26. return state.data.reduce((num, item) => num += item.checked && item.num, 0)
  27. },
  28. priceAll(state) {
  29. return state.data.reduce((num, item) => num += item.checked && item.num * item.price, 0)
  30. }
  31. },
  32. mutations: {
  33. changeDate(state, val) {
  34. // 在mutations 接受actions,第一步请求数据
  35. if (localStorage.getItem("vuex")) {
  36. //json数据刷新会重新请求数据,直接赋值list不会实现持久化所以,本地存储有用本地的没有用json
  37. state.data = JSON.parse(localStorage.getItem("vuex")).data;
  38. state.data1 = JSON.parse(localStorage.getItem("vuex")).data;
  39. } else {
  40. state.data = val;
  41. state.data1 = val;
  42. }
  43. },
  44. text(state, val) {
  45. state.text = val
  46. },
  47. // 全选逻辑
  48. ckAll(state, ckAllChecked) {
  49. // 将全选的状态赋值数据所有的状态,点击全选全部选中
  50. state.data.forEach(e => e.checked = ckAllChecked)
  51. },
  52. //反选逻辑
  53. ck(state, propsId) {
  54. console.log(propsId);
  55. // 循环原数据如果点击传过来的id=vuex的id,则子复选框状态改变
  56. state.data.forEach(item => item.id == propsId ? item.checked = !item.checked : '')
  57. state.vmCkAll = state.data.every(item => item.checked)
  58. },
  59. // 编辑文字切换
  60. edit(state) {
  61. state.edit = !state.edit
  62. },
  63. //删除
  64. del(state) {
  65. // 全选删除逻辑,就是将没被勾选的赋值原数据
  66. state.data = state.data.filter(item => !item.checked)
  67. state.vmCkAll = false
  68. },
  69. // 过滤
  70. okBtn(state) {
  71. //备份数据,用于过滤
  72. state.data = state.data1.filter(e => e.name.includes(state.text))
  73. }
  74. },
  75. actions: { //异步
  76. getData(context) {
  77. axios.get('/data.json').then(res => {
  78. // console.log(res);
  79. context.commit('changeDate', res.data.cartData)
  80. })
  81. }
  82. },
  83. //plugins插件 persist 持久
  84. plugins: [persist({
  85. storage: localStorage, // 定义数据存储的方式 值可以是localStorage 也可以是sessionStorage 或cookies
  86. reducer(state) {
  87. return { // 定义需要指定存储的数据
  88. data: state.data
  89. }
  90. }
  91. })]
  92. })

源码发在资源上了,希望看后对小伙伴与帮助

我是浪哥。
我热爱 vue.js , ElementUI , Element Plus 相关技术栈,我的目标是给大家分享最实用、最有用的知识点,希望大家都可以早早下班,并可以飞速完成工作,淡定摸鱼

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/100872
推荐阅读
相关标签