zoukankan      html  css  js  c++  java
  • Vue快速学习_第三节

    1. 过滤器

      • 局部过滤器(组件内部使用的过滤器,跟django的很像, filters: {过滤器的名字: {function(val, a,b){}}}

      • 全局过滤器(全局过滤器,只要过滤器一创建,在任何组件中都能使用, Vue.filter('过滤器的名字',function(val,a,b){}) )

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <div id="box">
          <App></App>
      </div>
      
      </body>
      <script src="vue.js"></script>
      <script src="moment.js"></script>
      <script>
          // 定义全局过滤器,字符串翻转
          Vue.filter('strReverse', function (val) {
              return val.split('').reverse().join('')
          });
      
          let App = {
             data(){
                 return{
                     // 创建日期对象
                      timer: new Date(),
                     msg: 'i love you',
                 }
             },
              methods: {
      
              },
              // YYYY-MM-DD HH:mm:ss 代表年月日 时分秒,过滤器的使用是 数据 | 过滤器的名字(第二个参数,第三个参数....)
              template:`
              <div>
                  <h3>{{ timer|myTime('YYYY-MM-DD HH:mm:ss') }}</h3>
                  <h3>{{ msg|strReverse }}</h3>
              </div>
              `,
              components: {
      
              },
              // 局部过滤器
              filters:{
                 // 时间格式化过滤器
                 myTime: function(val, formatStr){
                        //val 就是输入的时间数据, formatStr就是用户自定义的时间格式,moment是moment.js中一个日期处理类库的方法
                      return moment(val).format(formatStr);
                 }
              }
      
          };
          new Vue({
              el: '#box',
              data(){
                  return{
      
                  }
              },
              methods:{
      
              },
              components:{
                  App
              }
          })
      
      </script>
      </html>
    2. 生命周期的钩子函数

      1. beforeCreate(){} 组件创建之前,此时组件元素还不可调用

      2. created(){} 组件创建完成,组件元素可以调用,一般此时做ajax请求,实现数据驱动视图(常用,重要)

      3. beforeMount(){} 在挂载开始之前被调用,此时数据还未被加载到DOM上

      4. mounted(){} 装载数据到DOM之后调用,可以操作DOM(也比较重要)

      5. beforeUpdate(){} 在更新之前获取原始的dom

      6. updated(){} 更新完之后,调用此钩子获取最新dom,以便之后操作

      7. beforeDestroy(){} 实例销毁之前调用。在这一步,实例仍然完全可用

      8. destroyed(){} Vue 实例销毁后调用,一般用于定时器的销毁

      9. activated(){} keep-alive 组件激活时调用( keep-alive 组件主要作用,让组件产生缓存)

      10. deactivated(){} keep-alive 组件停用时调用

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="box">
        <App></App>
    </div>
    
    </body>
    <script src="vue.js"></script>
    <script src="moment.js"></script>
    <script>
        let Test1 = {
            data(){
              return {
                    msg1: 'Test1组件内容',
              }
          },
            template: `
                <div>
                    <h3 id="msgs">{{ msg1 }}</h3>
                    <button @click = 'clickHandler'>颜色修改</button>
                </div>
            `,
            methods:{
              clickHandler(){
                    document.querySelector('#msgs').style.color = 'red';
              },
            },
            // keep-alive 组件主要作用,让组件产生缓存, 所以组件激活停用后,状态会保存(例如上面的颜色就能被保存),激活时调用
            activated(){
                console.log('组件被激活了')
            },
            // keep-alive 组件停用时调用
            deactivated(){
                console.log('组件被停用了')
            }
        };
        let Test = {
          data(){
              return {
                    msg: 'Test组件内容',
                    count:null,
                    timer:null
              }
          },
            template: `
                <div>
                    {{ count }}
                    <h3>{{ msg }}</h3>
                    <button @click = 'clickHandler'>修改msg</button>
                </div>
            `,
            methods:{
              clickHandler(){
                    this.msg = '修改之后的Test组件内容';
                    document.querySelector('#msgs').style.color = 'red';
              },
            },
            beforeCreate(){
              console.log('组件创建之前')
            },
            created(){
              // 创建一个定时器,每秒加1
              this.timer = setInterval(()=> {
                  this.count++
              },2000);
              console.log('组件创建之后')
            },
            beforeMount(){
              // 获取不到<h3>Test组件内容</h3>,因为dom还没加载
              console.log(document.querySelector('#box'))
            },
            mounted(){
              // 可以获取到<h3>Test组件内容</h3>,因为此时dom已经加载完成
              console.log(document.querySelector('#box'))
            },
            beforeUpdate(){
              // 在更新之前获取原始的dom,点击了修改按钮才会执行更新这两个方法
                console.log(document.querySelector('#box').innerHTML)
            },
            updated(){
              // 更新完之后,调用此钩子获取最新dom,以便之后操作
                 console.log(document.querySelector('#box').innerHTML)
            },
            beforeDestroy(){
               console.log('在销毁之前')
            },
            destroyed(){
              // 由于定时器不会自动销毁,所以一般都会在destroyed方法里面进行销毁
                clearInterval(this.timer);
                console.log('在销毁之后')
            }
        };
    
        let App = {
           data(){
               return{
                   isShow: true,
                   isChange: true
               }
           },
            methods: {
                clickDestroy(){
                    this.isShow = !this.isShow;
                },
                clickActivate(){
                    this.isChange = !this.isChange;
                }
            },
            template:`
            <div>
                <Test v-if="isShow" />
                <button @click = 'clickDestroy'>销毁和创建组件</button>
                <keep-alive>
                    <Test1 v-if="isChange" />
                </keep-alive>
                <button @click = 'clickActivate'>激活和停用组件</button>
            </div>
            `,
            components: {
                Test,
                Test1
            },
        };
        new Vue({
            el: '#box',
            data(){
                return{
                }
            },
            methods:{
    
            },
            components:{
                App
            }
        })
    
    </script>
    </html>
    1. vue-router的基本使用

    Vue的全家桶 (vue+vue-router+vuex)

    vue+vue-router 主要来做 SPA(Single Page Application) 单页面应用, vue-router是vue的核心插件,

    网址为:https://router.vuejs.org/zh/

    为什么要使用单页面应用?

    传统的路由跳转,如果后端资源过多,会导致页面出现白屏现象,让前端来做路由,在某个生命周期的钩子函数中发送ajax,数据驱动, 为了用户体验.

    • vue-router使用及命名路由
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="box">
    
    
    </div>
    <script src="vue.js"></script>
    <script src="vue-router.js"></script>
    <script>
        //0 .如果以后是模块化编程,Vue.proptotype.$VueRouter = VueRouter
        //    Vue.use(VueRouter)
        // 1. 定义 (路由) 组件,可以从其他文件 import 进来,首先定义了首页和课程两个路由组件
        const Home = {
            data(){
                return{}
            },
            template:`<div>我是首页</div>`
        };
        const Course = {
            data(){
                return{}
            },
            template:`<div>我是课程页面</div>`
        };
         // 2.定义路由规则,每个路由应该映射一个组件。 其中"component" 可以是,还可以给路由起别名name:'Home'
        const routes = [
            {path: '/', redirect: '/home'},
            {path: '/home',name:'Home', component: Home},
            {path: '/course', component: Course},
        ];
        //3.创建 router 实例,然后传 `routes` 配置
        const  router = new VueRouter({
            //vue-router 默认 hash 模式(带#号),如果不想要很丑的 hash,我们可以用路由的 history 模式
            // mode:'history',
            routes // (缩写) 相当于 routes: routes
        });
        let App = {
            data(){
                return {}
            },
            // router-link和router-view 是vue-router 提供的两个全局组件
            //router-view  是路由组件的出口
            //router-link默认会被渲染成a标签,to属性默认被渲染成href, 绑定to属性,然后再{name:'Home'}通过首页的别名进行访问
            template:`
            <div>
                <div class="header">
                       <router-link :to="{name:'Home'}">首页</router-link>
                       <router-link to="/course">课程</router-link>
                </div>
                <router-view></router-view>
            </div>
            `,
        };
        new Vue({
            el:'#box',
            // 4.创建和挂载根实例,一定要记得挂载
            router,
            data(){
                return {}
            },
            template:`
            <App></App>
            `,
            components:{
                App
            }
        })
    </script>
    </body>
    </html>
    • 动态路由匹配

    $route 路由信息对象

    $router 路由对象 VueRouter

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="box">
    
    
    </div>
    <script src="vue.js"></script>
    <script src="vue-router.js"></script>
    <script>
        //动态路由匹配针对的是类似course/1 ,course/22 这样的访问,如果是course?xx=1,则需要用$route.query (如果 URL 中有查询参数)
        const Course = {
            data(){
                return{
                    id:null
                }
            },
            //4 id就发生了变化
            template:`<div>我是课程页面/{{ id }}</div>`,
            //提醒一下,当使用路由参数时,例如从 /course/1 导航到 /course/22,原来的组件实例会被复用。因为两个路由都渲染同个组件,
            // 比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。
            // 3. 所以用watch (监测变化) $route 对象
            watch:{
                // to表示要去哪里,点击/course/2,则to就是/course/2(当前路由信息对象),而from就是/course/1的信息(从/course/1来)
                '$route'(to, from){
                    // 对路由变化作出响应,
                    this.id = to.params.id;
                }
            }
        };
        const routes = [
            // 2.一个“路径参数”使用冒号 : 标记。当匹配到一个路由时,参数值会被设置到 this.$route.params
            {path: '/course/:id',name:'course', component: Course},
        ];
        const  router = new VueRouter({
            routes
        });
        let App = {
            data(){
                return {}
            },
            //1.通过这种params:{id:1}传参
            template:`
            <div>
                <div class="header">
                       <router-link :to="{name:'course',params:{id:1}}">课程1</router-link>
                       <router-link :to="{name:'course',params:{id:2}}">课程2</router-link>
                </div>
                <router-view></router-view>
            </div>
            `,
        };
        new Vue({
            el:'#box',
            router,
            data(){
                return {}
            },
            template:`
            <App></App>
            `,
            components:{
                App
            }
        })
    </script>
    </body>
    </html>
    • 编程式导航(this.$router.push({name:'Home'}))
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="box">
    
    
    </div>
    <script src="vue.js"></script>
    <script src="vue-router.js"></script>
    <script>
        const Home = {
            data(){
                return{}
            },
            template:`<div>我是首页</div>`
        };
        const Course = {
            data(){
                return{
                    id:null
                }
            },
            template:`<div>
                <div>我是课程页面</div>
                <button @click = 'clickHandler'>跳转首页</button>
            </div>
            `,
            methods:{
                // 编程式导航,将要跳转的页面放入$router中
                clickHandler(){
                    this.$router.push({
                        name:'Home'
                    })
                }
            },
        };
        const routes = [
            {path: '/home',name:'Home', component: Home},
            {path: '/course',name:'course', component: Course},
        ];
        const  router = new VueRouter({
            routes
        });
        let App = {
            data(){
                return {}
            },
            template:`
            <div>
                <div class="header">
                       <router-link :to="{name:'course'}">课程</router-link>
                </div>
                <router-view></router-view>
            </div>
            `,
        };
        new Vue({
            el:'#box',
            router,
            data(){
                return {}
            },
            template:`
            <App></App>
            `,
            components:{
                App
            }
        })
    </script>
    </body>
    </html>
     
  • 相关阅读:
    [LeetCode] 240
    [LeetCode] 169
    [LeetCode] 28
    [LeetCode] 27
    [LeetCode] 14
    [LeetCode] 9
    [LeetCode] 7
    [LeetCode] 2
    数据库开发规范
    Mysql优化
  • 原文地址:https://www.cnblogs.com/leixiaobai/p/11193007.html
Copyright © 2011-2022 走看看