vue-cli + mintUl的移动端练习项目总结(基础点)

项目中使用的知识点,及问题

1、如果不小心添加了eslint又不想用怎么修改?
config/index.js,搜索useEslint:true ,修改为false即可

2、饿了么组件 mintUI
安装 npm i mint-ui -S
使用:在main.js中引入并注册,(建议如果用的不多的话,按需引入,比较小点)

// 配置mintUi(按需引入的话就是在mint-ui/lib中找到需要的组件引入)
import MintUI from 'mint-ui'
// 引入css
import 'mint-ui/lib/style.css'
// 安装插件  注册全局组件及挂载属性
Vue.use(MintUI)

3、vue+axios请求本地json文件
(1)本地json文件需要放在static文件夹中
(2)json文件中要写图片地址的话,图片也需要放在static中,并且引入地址需要加上项目启动地址,比如:http://localhost:8080/static/1.jpg

4、v-for
v-for作用于组件,必须添加key值,否则会报错

5、关于vue模板中的变量和常量
带冒号的属性后面的值表示变量,不带表示常量

// xxx为常量
<nav-bar title="xxx"/>
// xxx为变量
<nav-bar :title="xxx"/>

6、style 的 scoped
<style scoped></style>
表示只对当前组件生效,加上之后可以从浏览器看出,给当前组件都增加了一个自定义属性用于区分
在这里插入图片描述

7、v-html插入的dom的样式设置
通过v-html插入的dom,不能在设置了scoped的style中修改样式,不起作用
原因是组件的渲染和装载样式的时机不对
解决方法:
(1)可以通过引入外部css文件,在外部css中设置
(2)把style 的scoped属性去掉(不建议这么做)

8、钩子函数
created(){} 钩子函数用于获取参数,发送axios请求
mounted(){} 用于操作dom,比如更改dom的高度等等
9、v-lazy 图片懒加载

<img v-lazy="img.img_url" alt=""/>
<style scoped>
 /* 图片懒加载样式 */
    image[lazy=loading]{
        width:40px;
        height:300px;
        margin:auto;
    }
</style>

10、路由导航守卫(路由钩子)用来做权限控制

  • (1)全局守卫(前):前端的权限控制中 next() next(false)

  • (2)后置路由(没什么用)

  • 路由独享的

  • 组件内的路由钩子函数
    (1)进入前,根据过来的组件路由做判断,让组件做不同显示
    beforeRouteEnter
    next(vm=>vm.xxx = 123)

 //路由确认前,组件渲染前的守卫函数
beforeRouteEnter(to,from,next){
   // 1、判断from  为空表示粘贴地址栏
   //   1.1、继续判断,根据to来设置title
   // 2、如果from 是新闻列表,就给title为新闻详情
   // 3、如果from是商品详情,就给title是商品图文介绍
   let title="";
   if(from.name == null){
       if(to.name === 'news.detail'){
           title = '新闻详情'
       } else if(to.name == 'photo.info'){
           title = "商品图文介绍"
       }
   } else if(from.name == 'news.list'){
       title = '新闻详情'
   }else if(from.name == 'goods.detail'){
       title = '商品图文介绍'
   }
   //最终都放行,大不了赋值一个title为空字符串
   next(vm=>{  // vm就是未来组件对象的this
       vm.title = title; 
   })
}

(2)路由更新(组件created不会被调用)
beforeRouteUpdate
路由参数的改变触发: ?id=xxx /xxx/:id

beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo:id,在/foo/1和foo/2之间跳转的时候,
    // 由于会渲染同样的Foo组件,因此组件实例会被复用
    // 而这个钩子就会在这个情况下被调用
    // 可以访问组件实例this
    // 总结:路由复用,但参数改变触发,参数指的是:query||params
    this.loadImgById(to.params.categoryId);// 这个是根据id获取数据的函数
    next();//影响着锚点值改变
},

(3)路由离开前(用户离开前的询问及相关保存)
beforeRouteLeave

// 离开购物车前保存当前删掉或者增加的商品
beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 this 
    if(confirm('亲,真的要离开吗?')){
      // 保存当前的剩余购物车
      let obj={};
      this.shopcart.forEach(goods=>{
        obj[goods.id] = goods.num;
      })
      GoodsList.saveGoods(obj);
      next();// 用于放行
    }else{
      next(false);// 取消导航行为
    }
  }

11、mint-ui的 Toast组件,提示框
使用 this.$toast('没有数据了~')

12、缩略图插件 vue-preview
安装:npm i vue-preview -S

// 图片预览插件
import VuePreview from 'vue-preview';
Vue.use(VuePreview); //内部运行

//使用  imgs是图片列表(有一定的数据格式,src图片地址,w宽h高)
<vue-preview :slides="imgs"></vue-preview>

13、样式
父子组件之间样式互相不牵扯
全局css控制所有

14、拦截器
用于实现数据返回前增加一个loading
一般全局配置,在main.js中

// 配置请求拦截器,显示loading
Axios.interceptors.request.use(function(config){
  //mint-ui的loading插件
  MintUI.Indicator.open({
    text:'玩命加载中...'
  })
  return config;
})
//配置相应拦截器,关闭loading
Axios.interceptors.response.use(function(response){
  // response.config类似上面request的config
  MintUI.Indicator.close()
  return response;
})

15、mint-ui 组件 loadmore上拉获取更多数据

  • loadmore使用的时候需要去除index.html中的<!DOCTYPE html>,因为严格模式不支持移动端的某些东西
<mt-loadmore 
          :auto-fill='false' 
          :bottom-method="loadBottom"
          ref="loadmore"
          :bottom-all-loaded = "isAllLoaded"  // loadmore的禁止函数调用的属性来控制,isAllLoaded自定义true/false,表示是否加载更多
        >
        需要加载的dom
</mt-loadmore>

this.$refs.loadmore.onBottomLoaded();//下拉通知元素重新定位,用于到底了没数据提示

this.$refs.loadmore.onTopLoaded()// 上拉


  • 需要给父元素一个高度(不让loadmore将父元素撑开):
    (1)设备高度 - 头 - 尾 = 中间的高度(loadmore父元素的高度)
    (2)app中给头尾添加 ref=“appHeader” ref=“appFooter”
    (3)通过给 router-view 设置自定义属性 :apprefs="refs" 将这两个组件传递给子元素,用通过this.apprefs.appHeader.$el获取该元素
let headerHeight = this.apprefs.appHeader.$el.offsetHeight;
let footerHeight = this.apprefs.appFooter.$el.offsetHeight;
this.boxHeight = document.body.clientHeight - headerHeight - footerHeight;
  • loadmore的重点、实现思路(图片并非原创来源网络)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    16、本地图片的引入
    需要告诉webpack要把引入的图片移动到未来的dist目录下,要不然会导致图片找不到
// 引入
import ImgSrc from '../asset/xxx.png';
// 使用
<img :src='ImgSrc' />

17、slot 坑 给子组件传入Dom的时候也可以指定坑名

<span slot="xx">1</span>
子组件内声明 <slot name="xx"></slot>

18、内置组件

  • keep-alive 缓存频繁的创建和销毁的组件 =>停用与激活
  • transition 给元素或组件添加 过渡效果(js + css)

17、vue过渡的使用

包裹组件(组件更替的显示)
mode = “out-in” 当前元素先进行过渡,完成后新元素过渡进入
mode = “in-out” 新元素先过渡,完成后当前元素过渡离开


<transition name="rv" mode="out-in">
      <router-view class="tmpl"></router-view>
</transition>
   

样式(给元素设置进入离开动画)

<style scoped>
.rv-enter-active,.rv-leave-active{
  transition: opacity .5s;
}
.rv-enter,.rv-leave-to{
  opacity: 0;
}
</style>

20、特殊函数

  • this.$nextTick(fn) 在vue生成dom以后Dom操作行为
    比如:当前this.isExist = true;立即操作这个元素不行
    需要在$nextTick()中,因为当前代码执行的时候元素还未存在
  • this.$set(obj,key,value);
    手动通知vue数据响应式
  • this.$refs.xxx => ref='xxx'
    元素获取的就是元素对象
    组件获取的就是组件对象, xxx.$el 获取的是DOM对象

21、computed计算属性,用于监视数据
用于计算购物车总数,总价

数据使用

<p>一选择商品{{paymenet.count}}件,总价¥{{paymenet.price}}</p>

计算属性定义

computed:{
    paymenet(){
      let price = 0;
      let count = 0;
      this.shopcart.forEach(goods=>{
        if(goods.isSelected){ //选中的话再计算
          count += goods.num;
          price += goods.num * goods.sell_price;
        }
        
      })
      return{
        count,price
      }
    }
  },

22、EventBus
就是一个new Vue

  • $emit(xxx,数据)
  • $on(‘xxx’,fn)
  • $once(‘xxx’,fn)
  • $off(‘xxx’)
    使用:
    (1) 新建一个EventBus.js(内容如下)
import Vue from 'vue';

// bus公交车,基于事件的同一个载体对象
let EventBus = new Vue();

// $on(事件名,function(){})  ->  $emit('事件名', 数据)

export default EventBus;

(2) 子组件引入,传值

import EventBus from '@/EventBus.js';
 //通知App组件增加数量
EventBus.$emit('addShopcart',this.pickNum);

(3) 父组件接值执行

import EventBus from './EventBus.js'

created(){
   EventBus.$on('addShopcart',data=>{
     console.log(data);
     console.log(this);
     this.num += data;
   })
 }

23、打包 npm run build

dis目录,默认会生成 有带.map的文件
在config/index.js中有个productionSourceMap改为false即可

在这里插入图片描述
24、路由懒加载
路由懒加载按需加载路由,节省流量
只用于路由相关的组件(全局组件不行)
(1)router/index.js中修改引入方式(其他的不变)

const Home = () => import( '@/components/Home/Home');
const Member = () => import( '@/components/Member/Member');

(2)安装 babel

npm i --save-dev babel-plugin-syntax-dynamic-import

(3)配置babel,.babelrc文件中,增加plugins syntax-dynamic-import

"plugins": ["syntax-dynamic-import"],

附带项目demo链接:
demo提取码:gh0a

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue-cli是一个官方推出的Vue项目脚手架工具,用于快速搭建Vue项目。ts是TypeScript的简称,是一种由微软开发的开源编程语言,它是JavaScript的超集,可以为JavaScript代码添加静态类型检查和封装类、模块等面向对象编程的特性。antd是蚂蚁金服开源的一套基于React封装的UI组件库,提供了丰富的高质量的React组件。 将这三者结合在一起,意味着我们可以利用Vue-cli搭建一个基于Vue和TypeScript的项目,并使用antd组件库来构建界面。这样的项目结合了Vue的简洁、易用和高效性能,TypeScript的类型检查和面向对象编程特性,以及antd的高质量UI组件,可以提升开发效率和代码质量。 在使用Vue-cli创建项目时,可以选择使用TypeScript作为项目的开发语言,这样项目就会自动集成TypeScript的相关配置和支持。通过使用Vue-cli提供的命令和配置,我们可以快速搭建一个工程化的项目结构,并集成Webpack等构建工具。 在项目中使用antd组件库时,可以通过npm或者yarn安装antd包,然后在Vue的组件中引入所需的组件,并进行相关配置和使用。antd提供了丰富的UI组件,包括按钮、表单、弹窗、表格等常见的界面元素,可以根据项目需求进行选择和使用。 在使用TypeScript编写Vue项目时,可以利用TypeScript的静态类型检查、类型提示功能,提升代码的可读性和可维护性。同时,可以使用面向对象的编程方式来组织代码,更好地管理和封装组件、模块等。 综上所述,使用Vue-cli搭建一个基于Vue、TypeScript和antd的项目,可以充分发挥各自的优势,提升开发效率和代码质量,同时能够满足丰富的UI界面需求。这样的项目具备良好的可扩展性和可维护性,适合于中大型前端项目的开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值