文章目录

0.vue组件、路由和axios

1.基本介绍

2.准备开始


2.1 学员反馈

凃凃老师, 该拓展的一定要拓展, 即使有部分同学跟起来吃力 , 以后工作很可能在项目中遇到相似问题, 至少知道老师讲过 , 有对照也好解决. 可以说清楚有哪些必须掌握, 有哪些让有余力的同学掌握.

2.2 复习

  • vue单文件方式 xxx.vue
  • 1:准备好配置文件 package.json(包描述文件&& 封装命令npm run dev) + webpack.config.js文件(打包的配置文件)
  • 2:创建index.html(单页应用的页)
  • 3:创建main.js(入口文件)
  • 4:引入vue和相关的文件xxx.vue
  • 5:new Vue(options)
  • 6:options(选项):
    • data
    • methods
    • components(组件内声明子组件)
    • props
  • 7:实例:
    • 在组件内(xxx.vue)中的this
    • new Vue()
    • 事件
      • this.$on(事件名,回调函数(参数))
      • this.$emit(事件名,数据)
      • this.$once(事件名,回调函数(参数)) 就触发一次
      • this.$off(事件名); 取消事件
  • 8:全局
    • Vue.component(‘组件名’,组件对象) 在哪里都可以使用
  • 9: 组件传值
    • 父传子: 属性作为参数
      • 常量 title=“xxx” 子组件声明接收参数 props:[‘xxx’]
      • 变量 :title=“num” 子组件声明接收参数 props:[‘xxx’]
    • 子传父: vuebus(只能是同一辆车)
      • 先停车到父组件,On一下
      • 再开车到子组件,如果需要的话,emit一下,触发上述事件的回调函数

2.3 今日重点

  • vue组件的使用
  • 组件间通信
  • vue-router使用
  • vue-resource发起http请求
  • axios

3. 过滤器

  • content | 过滤器,vue中没有提供相关的内置过滤器,可以自定义过滤器
  • 组件内的过滤器 + 全局过滤器
    • 组件内过滤器就是options中的一个filters的属性(一个对象)
      • 多个key就是不同过滤器名,多个value就是与key对应的过滤方式函数体
    • Vue.filter(名,fn)
  • 输入的内容帮我做一个反转
  • 例子:父已托我帮你办点事
  • 总结
    • 全局 :范围大,如果出现同名时,权利小
    • 组件内: 如果出现同名时,权利大(优先),范围小,如果子组件中没有过滤器就会用全局过滤器而不会用父组件的

4. 获取DOM元素

  • 救命稻草, 前端框架就是为了减少DOM操作,但是特定情况下,也给你留了后门
  • 1.在指定的元素上,添加ref=“名称A”
  • 2.在获取的地方加入 this.$refs.名称A
    • 如果ref放在了原生DOM元素上,获取的数据就是原生DOM对象
      • 可以直接操作直接修改dom,把修改后的结果渲染出来,更好的方式是操作变量
    • 如果ref放在了组件对象上,获取的就是组件对象
      • 1:获取到DOM对象,通过this.refs.sub.el,进行操作
    • 对应的事件
      • created 完成了数据的初始化,此时还未生成DOM,无法操作DOM
      • mounted 将数据已经装载到了DOM之上,可以操作DOM
//载入后 数据已经就位 将数据渲染到页面上,dom已经生成
mounted() {
    console.log("mounted",this.$refs.myDiv);
    console.log("mounted",this.$refs.sub);
    console.log("mounted",this);  //组件对象
    //涉及dom类的操作
    this.$refs.myDiv.innerHTML = 'hahahhah';
    //更好的方式是操作变量,涉及到数据的操作
    this.text = '99999';
    //操作组件对象并获取dom对象
    console.log(this.$refs.sub.$el);
    this.$refs.sub.$el.innerHTML = '和嘿嘿';
},

5.mint-ui

  • 组件库
  • 饿了么出品,element-ui 在PC端使用的
  • 移动端版本 mint-ui
  • https://mint-ui.github.io/#!/zh-cn
  • 注意:
    • 如果是全部安装的方式
      • 1:在template中可以直接使用组件标签
      • 2:在script中必须要声明,也就是引入组件对象(按需加载) //在js中所有变量都是模块作用域,按需引入
    • 填坑笔记: redict问题,安装redict相关模块,引入style-loader相关模块 ==> babel解析

6.wappalyzer

7.vue-router

  • 前端路由 核心就是锚点值的改变,根据不同的值,渲染指定DOM位置的不同数据
  • angular ui-router:锚点值改变,如何获取模板?ajax、
  • vue中,模板数据不是通过ajax请求来,而是 调用函数获取到模板内容
  • 核心:锚点值改变
  • 以后看到vue开头的,就知道必须Vue.use
  • vue的核心插件:
    • vue-router 路由
    • vuex 管理全局共享数据
  • 使用方式
    • 1:下载 npm i vue-router -S
    • 2:在main.js中引入 import VueRouter from 'vue-router';
    • 3:安装插件 Vue.use(VueRouter);
    • 4:创建路由对象并配置路由规则
      • let router = new VueRouter({ routes:[ {path:'/home',component:Home} ] });
    • 5:将其路由对象传递给Vue的实例,options中
      • options中加入 router:router
    • 6:在app.vue中留坑使用 <router-view></router-view>

7.1 命名路由

  • 需求,通过a标签点击,做页面数据的跳转
  • 使用router-link标签
    • 1:去哪里 <router-link to="/beijing">去北京</router-link>
    • 2:去哪里 <router-link :to="{name:'bj'}">去北京</router-link>
      • 更利于维护,如果修改了path,只修改路由配置中的path,该a标签会根据修改后的值生成href属性
routes: [
    //配置name方便查找只用名称就可以找到,
    //path是url上显示的地址,是正则匹配后面有?xxx都不影响
    //更好使用,方便修改
    { name:'music', path: '/mymusic',component: Music },
    { name:'movie', path: '/movie', component: Movie },
]

//或者在router实例中使用方法 addRoutes()
router.addRoutes([
    //重定向  从上到下
    {path: '/', redirect: {name: 'home'}},
    {name: 'home', path: '/home', component: Home},
    {path: '*', component: NotFound},
])

7.2 参数router-link

  • 在vue-router中,有两大对象被挂载到了实例this
  • $route(只读、具备信息的对象)、$router(具备功能函数)
  • 查询字符串 query
    • 1:去哪里 <router-link :to="{name:'detail',query:{id:1} } ">xxx</router-link>
    • 2:导航(查询字符串path不用改) { name:'detail' , path:'/detail',组件}
    • 3:去了干嘛,获取路由参数(要注意是query还是params和对应id名)
      • this.$route.query.id
  • path方式
    • 1:去哪里 <router-link :to="{name:'detail',params:{name:1} } ">xxx</router-link>
    • 2:导航(path方式需要在路由规则上加上/:xxx)
    • { name:'detail' , path:'/detail/:name',组件}
    • 3:去了干嘛,获取路由参数(要注意是query还是params和对应name名)
      • this.$route.params.name

7.3 编程导航

  • 原因:不能保证用户一定会点击某些按钮
  • 并且当前操作,除了路由跳转以外,还有一些别的附加操作
  • this.$router.go 根据浏览器记录 前进1 后退-1
  • this.$router.push(直接跳转到某个页面显示)
    • push参数: 字符串 /xxx
    • 对象 : {name:'xxx',query:{id:1},params:{name:2} }
    • 通过绑定自定义事件,在methods里面定义函数实现 this.$router.push('/movie'); 或者 this.$router.push({name: 'movie' }); 或者
      this.$router.go(-1);
    • 也可以传递参数 this.$router.push({name: 'movie', query: {id:1, name:2}});

7.4 原生实现编程导航

window.addEventListener('hasnchange', function(){
    var text = '';
    switch(location.hash){
        case '#/music':
            text='音乐数据';
            break;
        case '#/movie':
            text='电影数据';
            break;
    }
    document.getElementById('app').innerHTML=text;
})

7.5 复习

  • 过滤器,全局,组件内
  • 获取DOM元素 ,在元素上ref=“xxx”
  • 在代码中通过this.$refs.xxx 获取其元素
    • 原生DOM标签获取就是原生DOM对象
    • 如果是组件标签,获取的就是组件对象 $el继续再获取DOM元素
  • 声明周期事件(钩子)回调函数
    • created: 数据的初始化、DOM没有生成
    • mounted: 将数据装载到DOM元素上,此时有DOM
  • 路由
    • window.addEventListener('hashchange',fn);
    • 根据你放<router-view></router-view><div id="xxx"></div> 作为一个DOM上的标识
    • 最终当锚点值改变触发hashchange的回调函数,我们将指定的模板数据插入到DOM标识上

7.6 重定向和404

  • 一进入页面后,默认就是/
  • 重定向 { path:'/' ,redirect:'/home' }
  • 重定向 { path:'/' ,redirect:{name:'home'} }
  • 404 : 在路由规则的最后的一个规则
    • 写一个很强大的匹配
    • { path:'*' , component:notFoundVue}

7.7 多视图

  • 以前可以一次放一个坑对应一个路由和显示一个组件
    • 一次行为 = 一个坑 + 一个路由 + 一个组件
    • 一次行为 = 多个坑 + 一个路由 + 多个组件
  • components 多视图 是一个对象 对象内多个key和value
    • key对应视图的name属性
    • value 就是要显示的组件对象
      routes: [{path: '/', components:{header: HeaderVue, footer: FooterVue, default: MidVue}}]
  • 多个视图<router-view></router-view> -> 不传 name就是default
  • <router-view name='xxx'></router-view> -> name就是xxx

7.8 嵌套路由

  • 用单页去实现多页应用,复杂的嵌套路由
  • 开发中一般会需要使用
  • 视图包含视图
  • 路由父子级关系路由
  • router-view 包含 router-view
  • 而router-view是关联路由的path匹配
  • 父级路由包含子路由
//组件内包含着第一层router-view
{ name:'music' ,path:'/music', component:Music ,
children:[   //子路由的path /就是绝对路径   不/就是相对父级路径,推荐使用相对路径 .和_都可以标识名字非必须
    {name:'music.oumei' ,path:'oumei', component:Oumei },
    {name:'music.guochan' ,path:'guochan', component:Guochan }
]
}

8.vue-resource(了解) 发起http请求

  • 可以安装插件( Vue.use() ),早期vue团队开发的插件
  • 停止维护了,作者推荐使用axios
  • options预检请求,是当浏览器发现跨域 + application/json的请求,就会自动发起
  • 并且发起的时候携带了一个content-type的头
  • 在vue实例的created钩子函数中发起请求
  • npm i vue-resource -S
  • 引入 import VueResource from 'vue-resource'
  • 挂载 Vue.use(VueResource); 所有的vue实例都可以通过this.httpVuehttp 函数
created(){
    //get请求
    this.$http.get('urladdress')
    .then(res =>{
        console.log(res);
        this.data = res.body.message;
    },err =>{
        console.log(err);
    });
    //post请求
    this.$http.post('urladdress',{
        //请求的数据
        content: 'something'
    },{
        //设置 消除json的预检请求
        emulateJSON: true;
        //此时请求头为 conten-type: application/x-www-form-urlencoded
    })
    .then(res=>{
        this.data = res.body.message;
    },err=>{
        console.log(err);
    });
}

9. axios

  • https://segmentfault.com/a/1190000008470355?utm_source=tuicool&utm_medium=referral
  • post请求的时候,如果数据是字符串 默认头就是键值对,否则是对象就是application/json
  • this.$axios.get(url,options)
  • this.$axios.post(url,data,options) data是传的字符串
  • options:{ params:{id:1}//查询字符串, headers:{ ‘content-type’:‘xxxxx’ },baseURL:’’ }
  • 全局默认设置 :Axios.defaults.baseURL = ‘xxxxx’;
  • 上面的针对当前这一次请求的相关设置
  • form-data是key=value形式
import Axiox from 'axios';
//给对象的原型挂载属性,所有的实例对象都可以使用
Vue.prototype.$axios = Axios;
...
created(){
    //get请求
    this.$axios.get('url')
    .then(res=>{
        console.log(res);
        this.data = res.data.message;
    })
    .catch(err=>{
        console.log(err);
    });
    //post请求
    this.$axios.post('url',
        'content=something',{
            headers: application/x-www-form-urlencoded
        }
    )
    .then(res=>{
        console.log(res);
        this.data = res.data.message;
    })
    .catch(err=>{
        console.log(err);
    });
}

10. 如何练习

10.1 vue 学习方式

  • 框架的使用 照抄 =熟悉代码
  • 框架先掌握应用 明确组件的套路 引包使用占位
  • 基于webpack --> 打包的好处
10-03 18:40