vue尚品汇电商项目

  • Post author:
  • Post category:vue

1,配置环境

npm、node以及安装淘宝镜像,创建vue脚手架

npm config set registry https://registry.npm.taobao.org

npm install -g @vue/cli  (全局安装@vue/cli )

vue create xxx  (切换到你要创建的项目目录,使用命令进行项目创建)

npm run serve  (运行项目,前提是在创建目录之下)

cnpm install –save less less-loader@5  (安装less样式)

首次运行时报错

 解决办法:在vue.config中加入

components文件夹:经常放置一些非路由组件或者全局组件

pages|views文件夹:经常放置路由组件

2,路由配置过程

首先安装路由插件cnpm install –save vue-router(可以在package.json中查看有无vue-router)

运行路由组件报错:

export ‘default’ (imported as ‘VueRouter’) was not found in ‘vue-router’ (possible exports: NavigationFailureType, RouterLink, RouterView, START_LOCATION, createMemoryHistory, createRouter, createRouterMatcher, createWebHashHistory, createWebHistory, isNavigationFailure, loadRouteLocation, matchedRouteKey, onBeforeRouteLeave, onBeforeRouteUpdate, parseQuery, routeLocationKey, routerKey, routerViewLocationKey, stringifyQuery, useLink, useRoute, useRouter, viewDepthKey)

原因:版本不兼容,版本过高,下载旧版本即可

解决方法: cnpm install vue-router@3.1.3 –save-dev

1),在mian.js中注册router,所有组件都拥有$route、$router属性

$route:一般获取路由信息,比如路径、query参数、parmas参数

parmas参数:属于路径中的一部分,一般需要占位,

query参数:不属于路径中的一部分,不需要占位,形式式:?….

$router:一般进行编程式路由导航的跳转,比如push、replace等等

2),路由跳转:声明式路由导航(router-link)、编程式导航(push|replace)

3),利用路由元信息可以判断或者控制某个组件的显示或隐藏

4),路由传参

         第一种:字符串写法:params+query参数

         this.$router.push(‘/sreach/’+this.keyWord+”?k=”+this.keyWord.toUpperCase());

         第二种:模板字符串

         this.$router.push(`/sreach/${this.keyWord}?k=${this.keyWord.toUpperCase()}`)

         第三种:对象(前提是路由有名字)

        this.$router.push({

          name:”sreach”,

          params:{word:this.keyWord},

          query:{k:this.keyWord.toUpperCase()}

        })

5),对象写法中path能否和parmas参数一起使用?

        不能,对象中可以使用path或者name的形式,但是path不能和parmas参数搭配使用,显示query参数,但是不显示params参数

6),如何指定params参数可传可不传?

假若路由中已经占位,但是不传递参数,你就会发现URL有问题,跳转至哪个路由路径不显示了,解决可传可不传,只需要在路由占位时,后面加上?即可

 7),params参数可以传递也可以不传递,如果传递的是空串,该如何解决?

在params参数后面或上undefined

 8),路由组件能不能传递props参数?可以的

3,服务器及其接口配置

 1),安装axios: cnpm install –save axios

  2),通常api文件夹放置axios请求,request.js主要对axios进行二次封装,index.js主要实现对接口的统一配置

3),加载数据或者获取数据时,进度条的显示

cnpm install –save nprogress(安装)

4,vuex的使用

1),安装:cnpm install –save vuex     

2),vuex是官方提供的一个插件,状态管理库,集中式管理项目中组件共用数据

3),在store文件夹下新建index.js文件,别忘记在main.js中引入和注册

state:仓库存储数据的地方

mutations:修改state的唯一手段

 actions:处理action,可以书写自己的业务逻辑

getters:计算属性,用于简化仓库数据

4),获取不到仓库数据,数据显示

 

原因是版本不兼容,下载对应版本号,不必太高:

cnpm install –save vuex@3.6.2

5),vuex仓库

5,总结归纳

 1,鼠标移上去才有背景色:写动态类名–:class=”{cur:currentIndex==index}”

 2,动态展示,鼠标移上显示:写动态样式–:style=”{display:currentIndex==index?’block’:’none’

 3,演示卡顿现象,用户操作过快,数据来不及加载—-函数的防抖与节流

防抖:前面的触发都被取消,最后一次在规定时间内才会触发,也就是如果连续快速的触发,只会执行一次

节流:在规定时间内不会重复触发,只有大于时间间隔才会触发,把频繁触发变为少量触发 

 4,TypeNav组件

点击一级、二级以及三级标签,跳转至另一组件,但是给每个标签写点击事件又太繁琐,这时候给它最近的父元素绑定单击事件,利用编程式导航+事件委派实现(但是怎么才能知道点击哪个标签传递什么参数呢)

利用自定义属性

区分哪个标签—:data-categoryName=”c1.categoryName(:data-categoryName=”c2.categoryName)

区分几级标签—:data-category1Id=”c1.categoryId(:data-category2Id=”c2.categoryId)

5,如何解决跨域问题?

jsonp以及反向代理服务器

6,在三级联动中派发函数,向服务器中获取数据,可不必再其本身组件上派发,因为它是个全局组件,每挂载一次就会执行,咱们在main.js中去派发请求,使home仓库中有数据,而且只执行一次,直接去home仓库中要数据即可

注意!!!不能放在main.js中,因为this.$store.dispatch(“categoryList”);中的this啥也不是,身上也没有$store属性,只有组件才有

7,注意路由跳转是$router,有无属性的是$route

 this.$router.push(location);    this.$route.query

8,mock模拟接口

cnpm install mockjs(注意json中涉及到的图片要放入public中)json的数据默认是对外暴露的,最后再main.js中引入(import ‘@/mock/mockServe’;)

9,轮廓图

swiper.com.cn–中文教程有基本使用方法–在new swiper样式之前,页面的结构必须要有—安装版本5最好( cnpm install –save swiper@5)   

轮廓图数据是从服务器中获取,然后动态渲染的,v-for进行遍历,此时要想保证 new swiper样式之前页面有结构,需用到watch+$nextTick:在下次dom更新完,循环结束之后立即执行   

9,只有页面派发action请求后,相应的仓库才会获取数据,只有从仓库中得到数据后,相应的组件身上才有相对应的数据

          

10,getters计算属性的时候,需要考虑仓库中的数据是否存在,数据状态有两种,一种空数组或空对象,另一种数据已存在,为避免有bug,我们在获取数据的时候加上空数组或者空对象goodList(state){    return state.sre.goodsList  || [ ]   }

11,由于sreach组件要请求多次,所以派发action的时候不应再mounted中派发,因为函数是定义一次,多次调用的,咱们可以利用函数来实现  mounted(){  this.getDate();  }  —   

 methods:{

      //向服务器发送请求获取sreach模块数据(根据参数不同展示不同数据)

      getDate(){

         this.$store.dispatch(‘sreachlist’,{});

      }

12,向服务器中带参数的,而且还是多个,咱们可以使用响应式数据来传参

13,

是因为仓库一开始是空对象,去找相应的数据没有,会进行错误提示,为了更严谨一点

 14,

可以先进行测试一下

15,进行路由跳转时,之前前一组件已经获取到仓库中的数据(目前只考虑query参数,通过query传递一简单参数)不想服务器发送请求,也不通过query传参,

想到浏览器的本地存储和会话存储,—复杂的产品信息,咱们通过会话存储(不持久化),但是二者都不能存储数据的对象形式,一般存放的时候字符串,利用json把对象转化为字符串

   sessionStorage.setItem(‘SKUINFO’,JSON.stringify(this.skuInfos))

接收组件中 

16,去购物车结算的时候,需要知道用户的身份,不然服务器给你返回的数据是null–通过请求头传递给服务器,先临时使用游客身份,需要持久化存储身份–可以参考uuid_token

17,在css样式中,也可以使用@,代表的是src,但是注意的是需要在前面加上~(~@)

18,导航守卫:导航–就是你跳转至哪个路由组件,守卫–限制条件

守卫-全局守卫:只要在组件中,只要路由发生变化,就可以监听到

19,包括js文件,都不需要用this

20,js文件中引入store,使用的时候就不必用this.$store——————————————————–  let name=store.user.info.name;      await store.dispatch(‘getuserinfo’

  let name=store.state.user.info.name;
  let token=store.state.user.token;
  try {
           //没有用户信息,去获取用户信息
        await store.dispatch('getuserinfo');
        next()
        } catch (error) {
          //获取不到用户信息,重新登录
            await store.dispatch('userlogin');
            next('/login')
        }

21,假若获取数据不使用vuex,

在main.js 中引入所有api中的函数,API可以获取到api中所有接口,并把API放入vue的原型对象上,所有组件都可以直接使用,再次引用的时候就不用带vue了

import * as API from '@/api'
console.log(API)
beforeCreate(){
  Vue.prototype.$bus=this;
  Vue.prototype.$API=API;

},

在组件中使用方法 

 submitorder(){
        this.$API.reqcommitrade()
      }
    },


版权声明:本文为wtt123_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。