当前位置 博文首页 > 苦海:vue-router路由、mixin混入、vue-resource、axios、计算属

    苦海:vue-router路由、mixin混入、vue-resource、axios、计算属

    作者:[db:作者] 时间:2021-09-10 10:21

    路由vue-router介绍:

    	 // 1.前端路由核心:锚点值的改变,根据不同的锚点值,渲染指定dom位置的不同数据。
        // 2.vue中,模板数据不是通过ajax请求的,而是调用函数获取到模板内容
        // 3.vue-router使用方式:
                    // 1.下载路由组件  :  npm i vue-router -S
                    // 2.在路由router.js文件中引入vue-router组件  :  import Router from 'vue-router'-----(引入前确保引入:import Vue from 'vue')
                    // 3.在路由router.js文件中安装插件,挂载属性 :Vue.use(Router)
                    // 4.在路由router.js文件中创建路由对象,并配置路由规则后导出路由router.js文件:export default new Router({routers:[path:'/',name:'vue组件中配置属性name的值',component:导入的组件名]})
                    // 5.将路由router.js文件导入main.js文件中,并在vue实例中使用:new Vue({router,render: h => h(App)}),注意,在main.js 文件中接收router时,先导入router。
                    // 7.在app.vue中留坑,实现组件渲染:<router-view></router-view>  或者 <router-view/>
        
        // 4.router-link的使用:
          // <router-link :to="{name:'路由文件中路由name属性的值'}"></router-link> 或者 this.$router.push({path:''})-----路由跳转标签,相当于a标签,有name属性,改变锚点值,正常跳转,利于维护
          // <router-link to='路径'>----------没有name属性,改变锚点值,不会正常跳转,后面必须是具体路径
          // <router-link :to="{name:'music',query:{id:index}}"></router-link>-----router-link 中query:{id:index}是路径?后面传的参数,在跳转的新页面created属性中通过this.$router.query可以拿到值
        
          // 编程式路由-----------通过js函数来实现页面的跳转 
                // this.$router.go(1)----------根据浏览器记录前进后退,-1表示上一次浏览记录,1表示下一次浏览记录
                // this.$router.push('/url')----------直接跳转到某个页面显示 
                // this.$router.push({name:'路由配置中name属性的值'}) 
                // this.$router.push({name:'music',query:{id:2,name:2},params:{name:3}}) 
        
                // this.$router是具备功能的对象,而this.$route是不具备功能的,它支持只读。
        
          // 重定向路由:{path:'/',redirect:'/home'}---这种不方便维护,我们还是给它加上name属性,便于后期维护:{path:'/',redirect:{name:'路由中name属性的值'}}
        
          // 404页面处理:当输入的地址找不到时,这时可以在路由处理的最后一个配置{path:'*',component:引入的404页面组件}
        
          // 多视图路由----------此时在一个跟元素里面可以放多个坑,在路由文件配置中component变成components并且后面接的是一个对象,对象里面是路由匹配的组件:
              // <router-view name='naem1'>
              // <router-view name='naem2'>
              // <router-view>  --------------------{naem:'head',path:'/',components:{name1:对应组件,name2:对应组件,default:对应组件}},当留的坑里面没有设置name属性时,路由,components中配置名用default。
              
          // 嵌套路由---------路由嵌套路由,用单页应用实现多页应用,在一个引入的组件中继续留坑引入组件,页面中只有子组件发生变化:
            // 视图包含视图:
            // <router-link :to="{name:'homemusic'}">音乐</router-link>
            // <router-link :to="{name:'homemovie'}">电影</router-link><hr>
            // <router-view></router-view>
            // 父子级关系路由:
            // {
            //   name:'homepage',
            //   path:'/homepage',
            //   component:HomePage,//要渲染的父组件
            //   children:[//父组件中包含的子组件用children:[]属性,具体参考案例vuetest
            //     { name: 'homemusic', path: 'testmusici', component: Tmu },
            //     { name: 'homemovie', path: 'testmovie', component: Tmo }
            //   ]
            // }
            
          
          // 动态路由匹配----------路由冒号后面的路由是动态变化,不同的界面路由不同。
        
         
                
          // 命名路由和命名视图
                // 命名路由:------给路由定义不同的名字,根据名字进行匹配
                // 命名视图:------给不同的router-view定义名字,通过名字进行对应组件的渲染
        
                
        // 1.安装:
            // 1.直接下载:查看dist目录,dist目录下的文件是最新稳定版,不会同步更新到dev分支上的最新代码。
            // 2.CDN:引用网络资源。
            // 3.npm安装:npm install vue-router
        
        // 2.使用:var Vue = require('vue)
                // var VueRouter = require('vue-router) 或者 import VueRouter from 'vue-router'
                // Vue.use(VueRouter)
        
        // 3.前端路由和后端路由是不一样的。
          // 前端路由:路由地址是根据不同的URL地址展现不同的内容和页面,在做单页面应用,大部分页面结构不变,只改变部分内容的使用前端路由。优点:用户体验好,速度快。缺点:不利于SEO,没有合理利用缓存,单页面无法记住之前滚动的位置
    

    原生路由实现原理:

    	<body>
            <div id="content"></div>
            <script type="text/javascript">
            //监视锚点值的改变做出匹配并设置内容到对应的元素:
            window.addEventListener('hashchange', function() {
                var text = '';
                switch (location.hash) {
                    case '':
                        text = '主页';
                        break;
                    case '#/movie':
                        text = '电影页面';
                        break;
                }
                document.getElementById('content').innerHTML = text;
            })
            </script>
        </body>
    

    混入:

    混入定义了一部分可复用的方法或计算属性,混入对象可以包含任意组件选项。组件使用混入对象后,该组件将可以使用混入对象的方法或属性,如:

    	<script>
            // 1.定义一个混入对象:
            var myMixin = {
                data: {
                    sayhello: 'hello'
                },
                methods: {
                    say() {
                        console.log($this.data.sayhello);
                    }
                }
            };
        
            // 2.使用extend方法继承这个混入对象:
            var Component = Vue.extend({
                mixins: [myMixin] //mixins 用来混入一个混入对象
            });
        
            //3.实例化一个组件:
            var mycom = new Component();
        
            //4.在另一个实例中使用myMixin:
            var vm = new Vue({
                mxins: [myMixin],
                data: {
                    names: 'jack'
                }
            });
        </script>
    

    vue-resource简介:

    	 // 1.Vue-resource和jQuery中ajax一样,是一个异步请求插件,官方已经停止维护了,尤雨溪推荐使用axios,vue-resource使用步骤:
            // 1.引用文件:网络文件:<script src='https://cdn.jsdelivr.net/vue.resource/1.3.1/vue-resource.min.js'></script> 或者 下载到本地:<script src='vue-resource.min.js'></script>  或者 npm install vue-resource --save(推荐) 
            // 2.引入:import VueResource from 'vue-resource'
            // 3.挂载使用vue-resource: Vue.use(VueResource) ,确保引入vue和app.vue的情况下。
        
        // 2.vue-resource的请求API是按照REST风格设计的,它提供了7种请求API:
            // 1.get(url,[options])
            // 2.head(url,[options])
            // 3.delete(url,[options])
            // 4.jsonp(url,[body],[options])
            // 5.post(url,[body],[options])
            // 6.put(url,[body],[options])
            // 7.patch(url,[body],[options])
        
        //全局拦截器 interceptors:-------如果一个页面中有多个请求,此时需要做一个loading效果,这时可以使用interceptors做统一处理。
            Vue.http.interceptors.push((request,next)=> {
              // 请求发送前处理逻辑:
              next((response) =>{
                // 请求发送后处理逻辑:
                // 根据请求状态,response参数会返回给successCallback或errorCallback
                return response
              })
            }) 
        
        //实例:注意引入vue和vue-resource:
        <body>
        <div id="box">
        	<input type="button" @click="get()" value="获取数据">
        </div>
        <script>
        window.onload = function(){
        var vm = new Vue({
            el:'#box',
            data:{},
            methods:{
                get:function(){
                    //发送get请求
                    this.$http.get('/try/ajax/ajax_info.txt').then(function(res){
                        console.log(res.body);    
                    },function(){
                        console.log('请求失败处理');
                    });
                }
            }
        });
        }
        </script>
        </body>
    

    axios(ajax)插件介绍:

    	    // 1.axios插件:--------也是异步请求插件,跨三端的框架,使用步骤:
            // 1.引用文件:网络文件:<script src='https://unpkg.com/axios/dist/axios.min.js'></script> 或者 npm install axios --save(推荐)
            // 2.引入:import Axios from 'axios' ,确保vue和app.vue的引入。
            // 3.给Vue原型挂载axios属性: Vue.prototype.$axios = Axios;当然axios是直接暴露在root的,直接可以使用axios.API使用。
            // 4.提供的API:
                // 1.$axios.request(options)
                // 2.$axios.get(url[,options])
                // 3.$axios.delete(url[,options])
                // 4.$axios.head(url[,options])
                // 5.$axios.options(url[,options])
                // 6.$axios.post(url[,data[,options]])
                // 7.$axios.put(url[,data[,options]])
                // 8.$axios.natch(url[,options])
        
        // 2.合并请求:this.$axios.all([请求1,请求2])--------将两个请求合并发送,只要有一个失败,就算失败,全体成功才算成功,这里的请求并非路径,而是通过this.$axios.post或者get的方式请求。
        // 3.axios()中传递对象配置进行请求:
        axios({
          method:'post',
          url:'url',
          data:{
            key1:value1,
            key2:value2
          }
        });
        
        // 4.拦截器:过滤,在一次请求中添油加醋:
            // this.axios.interceptors.request.use(function(config){config.headers={}})
        // 5.token类似cookie,且三端都可通用。
        
        //实例:
        <div id="app"></div>
        <script>
        new Vue({
          el: '#app',
          data () {
            return {
              info: null
            }
          },
          mounted () {
            axios//链式调用
              .get('url')
              .then(function(response){
              console.log(response);
            })
              .catch(function (error) {
                console.log(