当前位置: 首页 > news >正文

网站建设与设计ppt模板下载四川seo推广公司

网站建设与设计ppt模板下载,四川seo推广公司,做网站是先做后台还是前端,网站源码站day-061-sixty-one-20230504-vue2项目-跳转拦截-重定向并返回前一页-使用vuex调用接口-全选与全不选-总价计算 vue2项目 跳转拦截 设置跳转拦截,比如在用户没token时,不能进入具体详情页,而是进入登录页进行登录。 跳转拦截具体思路 前端…

day-061-sixty-one-20230504-vue2项目-跳转拦截-重定向并返回前一页-使用vuex调用接口-全选与全不选-总价计算

vue2项目

跳转拦截

设置跳转拦截,比如在用户没token时,不能进入具体详情页,而是进入登录页进行登录。

跳转拦截具体思路

  1. 前端和后端约定好一个返回码,如resultCode为416,那么前端就跳转到登录页。
  2. 前端根据这返回码在axios的响应拦截器axios.interceptors.response.use()钩子函数中进行处理,如跳转到首页或登录面之类的操作。
  3. 前端发起一个需要token的请求。
  4. 后端收到前端的请求,校验token是否存在或合法。
    • 如果存在并合法,正常返回数据。
    • 如果token不存在或不合法,返回resultCode并为416。
  5. 如果后端返回resultCode并为416,就会触发axios的响应拦截器中的钩子函数,重定向到登录页。

跳转拦截实际步骤

  1. 在axios实例对象或axios原型上设置响应拦截器
    • /src/http/http.js

      import axios from "axios";import router from '../router/index.js'// 添加响应拦截器
      axios.interceptors.response.use((response) => {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么// 后端的resultCode为416时,要求重新登录。let { message, resultCode } = response.data;if (+resultCode === 416) {router.push(`/LoginView`)}return response.data;},function (error) {return Promise.reject(error);}
      );
      export default axios;
      

重定向并返回前一页

因重定向跳转登录页并登录成功后,在登录页中跳转返回前一页

重定向并返回具体思路

  1. 在在axios的响应拦截器axios.interceptors.response.use()钩子函数中跳转到登录页时,给路由加一个字段表示要重返前一页,如needback为true。
  2. 在登录页中,设置登录成功后,如果this.$route?.query?.needback存在,就返回到前一页。

重定向并返回实际步骤

  1. 在axios实例对象或axios原型上的响应拦截器进行跳转时,在需要的路由中加上?needback=true

    • /src/http/http.js

      import axios from "axios";
      import router from '../router/index.js'// 添加响应拦截器
      axios.interceptors.response.use((response) => {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么// 后端的resultCode为416时,要求重新登录。let { message, resultCode } = response.data;if (+resultCode === 416) {router.push(`/LoginView?needback=true`)}return response.data;},function (error) {return Promise.reject(error);}
      );
      export default axios;
      
  2. 在登录成功后,跳转的页面中根据this.$route?.query?.needback决定是返回前一页还是首页。

    • /src/views/LoginView.vue

      <script>
      import { Notify } from "vant";export default {components: {Verify,},data() {return {username: "",password: "",flag: true,verifyFlag: false,};},methods: {onSubmit() {this.$api.login(this.username, this.password).then((value) => {let { resultCode, message, data } = value;if (resultCode !== 200) {return;}// 有needback就返回上一页if (this.$route?.query?.needback) {this.$router.back();return;}// 无needback就返回前面this.$router.push("/IndexView");}).catch((error) => {console.log(`error-->`, error);}).finally(() => {console.log("登录操作后执行");});},},
      };
      </script>
      

使用vuex调用接口

使用vuex调用接口,以便使用vuex中的全局数据,制作如购物车这类效果。

使用vuex调用接口具体思路

  1. 定义一个接口。
  2. 在vuex中配置state,及mutations用于同步修改state,actions用于请求数据并调用mautaions方法间接修改state。
  3. 在需要中页面中引入state中的数据及actions方法,根据需要使用state中的数据和调用actions中的方法。

使用vuex调用接口实际步骤

  1. 在axios中添加一个接口,用于vuex中进行操作。

    • /src/http/index.js

      import http from "./http.js";// 获取购物车所有的产品
      function getCartList() {return http.get("/shop-cart");
      }export default {getCartList,
      };
      
  2. 在vuex中配置state,及mutations用于同步修改state,actions用于请求数据并调用mautaions方法间接修改state。

    • /src/store/index.js

      import Vue from "vue";
      import Vuex from "vuex";import api from "../http/index";Vue.use(Vuex);export default new Vuex.Store({state: {list: null,},mutations: {changeList(state, payload) {// 默认添加选中状态payload.map((item) => {item.selected = true;return item;});state.list = payload;},},actions: {async getCartListAsync({ commit }) {try {let res = await api.getCartList();console.log(`res-->`, res);let { data, resultCode } = res;if (+resultCode !== 200) {commit("changeList", []);return;}commit("changeList", data);} catch (err) {console.log(`err-->`, err);}},},
      });
      
  3. 在需要中页面中引入state中的数据及actions方法,根据需要使用state中的数据和调用actions中的方法。

    • /src/views/DetialView.vue

      <template><div class="detial-wrap"><van-goods-action><van-goods-action-iconv-show="list?.length <= 0"icon="cart-o"text="购物车"/><van-goods-action-iconv-show="list?.length > 0"icon="cart-o"text="购物车":badge="list?.length"/></van-goods-action></div>
      </template><script>
      import { mapState, mapActions } from "vuex";
      export default {data() {return {detialData: {},};},computed: { ...mapState(["list"]) },created() {if (this.list === null) {this.getCartListAsync();}},methods: {...mapActions(["getCartListAsync"]),},
      };
      </script>
      
    • /src/components/FooterPage.vue

      <template><div><van-tabbar v-model="active" active-color="#1baeae" :route="true"><van-tabbar-itemicon="shopping-cart-o"v-show="list?.length <= 0"to="/CartView">购物车</van-tabbar-item><van-tabbar-itemicon="shopping-cart-o"v-show="list?.length > 0":badge="list?.length"to="/CartView">购物车</van-tabbar-item></van-tabbar></div>
      </template><script>
      import { mapState, mapActions } from "vuex";
      export default {data() {return {active: 0,};},computed: {...mapState(["list"]),},methods: {...mapActions(["getCartListAsync"]),},created() {if (this.list === null) {this.getCartListAsync();}},
      };
      </script>
      

全选与全不选

  • 可以用一个变量isAll表示是否全选,用一个数组变量来记录所有已选值对应id。
    • 之后对已选数组进行监听或对于所有会改变的已选数组的事件都执行判断已选数组长度与选项数组总长度是否全等。
      • 若已选选项数组长度与选项数组总长度相等,那么就为true。
      • 若已选选项数组长度与选项数组总长度不相等,值就为false。
    • 全选与全不选中间态用另一个变量来表示。
      • 如果已选数组长度为0 或 已选数组长度与选项数组总长度全等,值为false。
      • 已选数组长度不为0并且已选数组长度与选项数组总长度不全等,值为true。
  • 可以用计算属性来做处理,用对象变量的布尔值属性来表示该对象是否被选中。
    • 在data或computed中定义一个基础对象数组,对象上有一个属性表示是否选中。
    • 在计算属性的get()来做返回的结果值。
    • 在计算属性的set()里来修改源头数组对象的表示是否选中的属性值,进而让get()得到的值发生改变。
    • 这个的前提是数组里对象及它的属性值是响应式的。

全选与全不选-计算属性版具体思路

  1. 在data或computed中定义一个基础对象数组,对象上有一个属性表示是否选中。
  2. 在计算属性的get()来做返回的结果值。
  3. 在计算属性的set()里来修改源头数组对象的表示是否选中的属性值,进而让get()得到的值发生改变。

全选与全不选实际步骤

  1. 在vuex中定义好state并引入到单文件组件中的计算属性。

    • /src/store/index.js

      import Vue from "vue";
      import Vuex from "vuex";import api from "../http/index";Vue.use(Vuex);export default new Vuex.Store({state: {list: null,},mutations: {changeList(state, payload) {// 默认添加选中状态payload.map((item) => {item.selected = true;return item;});state.list = payload;},},actions: {async getCartListAsync({ commit }) {try {let res = await api.getCartList();console.log(`res-->`, res);let { data, resultCode } = res;if (+resultCode !== 200) {commit("changeList", []);return;}commit("changeList", data);} catch (err) {console.log(`err-->`, err);}},},
      });
      
  2. 或者是在单文件组件里的data或computed中定义好要用的基础对象数组。

    • /src/views/CartView.vue

      <script>
      import { mapState, mapActions } from "vuex";
      export default {computed: {...mapState(["list"]),},created() {if (this.list === null) {this.getCartListAsync();}},methods: {...mapActions(["getCartListAsync"]),},
      };
      </script>
      
  3. 在计算属性的get()来做返回的结果值,通过基础对象数组的every()函数。

    • /src/views/CartView.vue

      <script>
      import { mapState, mapActions } from "vuex";
      export default {computed: {...mapState(["list"]),checkedAll: {get() {return this.list?.every((item) => item.selected === true);},},},created() {if (this.list === null) {this.getCartListAsync();}},methods: {...mapActions(["getCartListAsync"]),},
      };
      </script>
      
  4. 在计算属性的set()里来通过基础对象数组map()修改源头数组对象的表示是否选中的属性值,进而让get()得到的值发生改变。

    • /src/views/CartView.vue

      <script>
      import { mapState, mapActions } from "vuex";
      export default {computed: {...mapState(["list"]),checkedAll: {set(value) {this.list?.map((item) => {item.selected = value;return item;});},},},created() {if (this.list === null) {this.getCartListAsync();}},methods: {...mapActions(["getCartListAsync"]),},
      };
      </script>
      
    • /src/views/CartView.vue完整

      <template><div class="cart-wrap"><div class="content"><van-swipe-cell v-for="item in list" :key="item.goodsId"><div class="item"><van-checkboxv-model="item.selected"checked-color="#1BAEAE"></van-checkbox><img :src="item.goodsCoverImg" alt="" /><div><p>{{ item.goodsName }}</p><h3><span>¥{{ item.sellingPrice }}</span><van-stepper v-model="item.goodsCount" /></h3></div></div><template #right><van-button square text="删除" type="danger" class="delete-button" /></template></van-swipe-cell></div><van-submit-bar:price="allPrice"button-text="结算"button-color="#1BAEAE"><van-checkbox v-model="checkedAll">全选</van-checkbox></van-submit-bar></div>
      </template><script>
      import { mapState, mapActions } from "vuex";
      export default {data() {return {};},computed: {...mapState(["list"]),checkedAll: {get() {return this.list?.every((item) => item.selected === true);},set(value) {this.list?.map((item) => {item.selected = value;return item;});},},allPrice() {return this.list?.reduce((res, item) => {return (res + (item.selected ? item.sellingPrice * item.goodsCount * 100 : 0));},0);},},created() {if (this.list === null) {this.getCartListAsync();}},methods: {...mapActions(["getCartListAsync"]),},
      };
      </script>
      

总价计算

总价计算思路

  1. 在data或computed中定义一个基础对象数组,对象上有想要进行计算所需的全部数据。
  2. 在计算属性的get()来做返回的结果值或计算属性的函数式写法中计算出想要的结果。

总价计算步骤

  1. 在vuex中定义好state并引入到单文件组件中的计算属性。

    • /src/store/index.js

      import Vue from "vue";
      import Vuex from "vuex";import api from "../http/index";Vue.use(Vuex);export default new Vuex.Store({state: {list: null,},mutations: {changeList(state, payload) {// 默认添加选中状态payload.map((item) => {item.selected = true;return item;});state.list = payload;},},actions: {async getCartListAsync({ commit }) {try {let res = await api.getCartList();console.log(`res-->`, res);let { data, resultCode } = res;if (+resultCode !== 200) {commit("changeList", []);return;}commit("changeList", data);} catch (err) {console.log(`err-->`, err);}},},
      });
      
  2. 在data或computed中定义一个基础对象数组,对象上有想要进行计算所需的全部数据。

    • /src/views/CartView.vue

      <script>
      import { mapState, mapActions } from "vuex";
      export default {computed: {...mapState(["list"]),},created() {if (this.list === null) {this.getCartListAsync();}},methods: {...mapActions(["getCartListAsync"]),},
      };
      </script>
      
  3. 在计算属性的函数式写法中用reduce()计算出想要的结果。

    • /src/views/CartView.vue

      <script>
      import { mapState, mapActions } from "vuex";
      export default {data() {return {};},computed: {...mapState(["list"]),allPrice() {return this.list?.reduce((res, item) => {return (res + (item.selected ? item.sellingPrice * item.goodsCount * 100 : 0));},0);},},created() {if (this.list === null) {this.getCartListAsync();}},methods: {...mapActions(["getCartListAsync"]),},
      };
      </script>
      
    • /src/views/CartView.vue完整

      <template><div class="cart-wrap"><div class="content"><van-swipe-cell v-for="item in list" :key="item.goodsId"><div class="item"><van-checkboxv-model="item.selected"checked-color="#1BAEAE"></van-checkbox><img :src="item.goodsCoverImg" alt="" /><div><p>{{ item.goodsName }}</p><h3><span>¥{{ item.sellingPrice }}</span><van-stepper v-model="item.goodsCount" /></h3></div></div><template #right><van-button square text="删除" type="danger" class="delete-button" /></template></van-swipe-cell></div><van-submit-bar:price="allPrice"button-text="结算"button-color="#1BAEAE"><van-checkbox v-model="checkedAll">全选</van-checkbox></van-submit-bar></div>
      </template><script>
      import { mapState, mapActions } from "vuex";
      export default {data() {return {};},computed: {...mapState(["list"]),checkedAll: {get() {return this.list?.every((item) => item.selected === true);},set(value) {this.list?.map((item) => {item.selected = value;return item;});},},allPrice() {return this.list?.reduce((res, item) => {return (res + (item.selected ? item.sellingPrice * item.goodsCount * 100 : 0));},0);},},created() {if (this.list === null) {this.getCartListAsync();}},methods: {...mapActions(["getCartListAsync"]),},
      };
      </script>
      

进阶参考

  1. 新峰商城
  2. vant2 – 配合vue2
  3. Blob的三种应用场景及Blob,url,base64之间的转换
  4. 为什么视频网站的视频链接地址是blob?
http://www.shuangfujiaoyu.com/news/58102.html

相关文章:

  • 怎么做自己的cms导购网站seo专业培训中心
  • 做一个网站要多久重庆百度seo排名优化软件
  • 做本地网站赚钱吗?电商运营怎么做如何从零开始
  • 最专业企业营销型网站建设网上竞价平台
  • 德国网站建设网站改进建议有哪些
  • 网站 宗旨百度贴吧广告投放
  • jekyll做公司网站百度指数大数据
  • 朝阳网站建设公司seo排名查询工具
  • 蚌埠网站建设公司cztv百度如何快速收录
  • 平面设计常用的软件有哪些西安关键词seo公司
  • 木马设计公司官网seo在线优化排名
  • 厦门的服装商城网站建设建设营销网站
  • 杭州网站建设科技有限公司国际新闻快报
  • 万户网站天下徐州百度推广公司
  • 免费成品网站下载百度推广上班怎么样
  • 网站开发及维护合同app拉新平台有哪些
  • 外贸平台有哪些是免费的直接可以发布售卖产品的南京seo
  • wordpress主题对应的插件seo网络优化招聘信息
  • 济宁网站建设软件开发关键词推广优化排名品牌
  • 做ps从哪个网站上下载图片大小seo优化排名是什么
  • 开淘宝店要自己做网站吗网络推广自学
  • 17我们一起做网站国外外链平台
  • 锦州做网站多少钱百度快速排名软件原理
  • 品牌工厂网站建设个人网站制作软件
  • 津做网站免费网页代码大全
  • 自己如何做电影网站百度浏览器app下载
  • 网站如何做快排产品推广方法
  • 东莞常平做网站公司外链查询工具
  • 河南平顶山网站建设与管理专业seo外包公司兴田德润官方地址
  • 不学JavaScript可以做网站么seo类目链接优化