Vue学习笔记day02总结

本文深入讲解Vue.js的高级特性,包括品牌管理的CRUD操作、过滤器的自定义与使用、字符串格式化方法、全局按键修饰符定义、自定义指令实践、Vue生命周期解析及HTTP请求处理,适合进阶学习。

目录

1.品牌添加、删除、查询案例

2.过滤器

2.1全局过滤器

2.2私有过滤器

3.字符串的padStart方法的使用(指定显示长度)

4.自定义全局按键修饰符

5.自定义指令

5.1自定义全局指令

5.1.1 自定义全局指令让文本框获取焦点

5.1.2 自定义全局指令设置字体颜色(使用钩子函数的第二个参数)

5.2 自定义私有指令

5.3 binding、update函数简写

6.Vue实例的生命周期

7.使用vue-resource发起get、post、jsonp请求

8.jsonp的实现原理


1.品牌添加、删除、查询案例

  <link rel="stylesheet" href="./lib/bootstrap-3.3.7.css">

 <div id="app">
    <div class="panel panel-primary">
      <div class="panel-heading">
        <h3 class="panel-title">添加品牌</h3>
      </div>
      <div class="panel-body form-inline">
        <label>
          Id:
          <input type="text" class="form-control" v-model="id">
        </label>

        <label>
          Name:
          <input type="text" class="form-control" v-model="name" @keyup.f2="add">
        </label>

        <!-- 在Vue中,使用事件绑定机制,为元素指定处理函数的时候,如果加了小括号,就可以给函数传参了 -->
        <input type="button" value="添加" class="btn btn-primary" @click="add()">

        <label>
          搜索名称关键字:
          <!-- 注意: Vue中所有的指令,在调用的时候,都以 v- 开头 -->
          <input type="text" class="form-control" v-model="keywords" id="search" v-focus v-color="'green'">
        </label>
      </div>
    </div>

    <table class="table table-bordered table-hover table-striped">
      <thead>
        <tr>
          <th>Id</th>
          <th>Name</th>
          <th>Ctime</th>
          <th>Operation</th>
        </tr>
      </thead>
      <tbody>
        <!-- 之前, v-for 中的数据,都是直接从 data 上的list中直接渲染过来的 -->
        <!-- 现在, 我们自定义了一个 search 方法,同时,把 所有的关键字,通过传参的形式,传递给了 search 方法 -->
        <!-- 在 search 方法内部,通过 执行 for 循环, 把所有符合 搜索关键字的数据,保存到 一个新数组中,返回 -->
        <tr v-for="item in search(keywords)" :key="item.id">
          <td>{{ item.id }}</td>
          <td v-text="item.name"></td>
          <td>{{ item.ctime | dateFormat() }}</td>
          <td>
            <a href="" @click.prevent="del(item.id)">删除</a>
          </td>
        </tr>
      </tbody>
    </table>

  </div>


  <div id="app2">
    <h3 v-color="'pink'" v-fontweight="900" v-fontsize="50">{{ dt | dateFormat }}</h3>
  </div>

  <script>

    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        id: '',
        name: '',
        keywords: '', // 搜索的关键字
        list: [
          { id: 1, name: '奔驰', ctime: new Date() },
          { id: 2, name: '宝马', ctime: new Date() }
        ]
      },
      methods: {
        add() { // 添加的方法
          // console.log('ok')
          // 分析:
          // 1. 获取到 id 和 name ,直接从 data 上面获取 
          // 2. 组织出一个对象
          // 3. 把这个对象,调用 数组的 相关方法,添加到 当前 data 上的 list 中
          // 4. 注意:在Vue中,已经实现了数据的双向绑定,每当我们修改了 data 中的数据,Vue会默认监听到数据的改动,自动把最新的数据,应用到页面上;

          // 5. 当我们意识到上面的第四步的时候,就证明大家已经入门Vue了,我们更多的是在进行 VM中 Model 数据的操作,同时,在操作Model数据的时候,指定的业务逻辑操作;

          var car = { id: this.id, name: this.name, ctime: new Date() }
          this.list.push(car)
          this.id = this.name = ''
        },
        del(id) { // 根据Id删除数据
          // 分析:
          // 1. 如何根据Id,找到要删除这一项的索引
          // 2. 如果找到索引了,直接调用 数组的 splice 方法

          /* this.list.some((item, i) => {
            if (item.id == id) {
              this.list.splice(i, 1)
              // 在 数组的 some 方法中,如果 return true,就会立即终止这个数组的后续循环
              return true;
            }
          }) */


          var index = this.list.findIndex(item => {
            if (item.id == id) {
              return true;
            }
          })

          // console.log(index)
          this.list.splice(index, 1)
        },
        search(keywords) { // 根据关键字,进行数据的搜索
          /* var newList = []
          this.list.forEach(item => {
            if (item.name.indexOf(keywords) != -1) {
              newList.push(item)
            }
          })
          return newList */

          // 注意:  forEach   some   filter   findIndex   这些都属于数组的新方法,
          //  都会对数组中的每一项,进行遍历,执行相关的操作;
          return this.list.filter(item => {
            // if(item.name.indexOf(keywords) != -1)

            // 注意 : ES6中,为字符串提供了一个新方法,叫做  String.prototype.includes('要包含的字符串')
            //  如果包含,则返回 true ,否则返回 false
            //  contain
            if (item.name.includes(keywords)) {
              return item
            }
          })

          // return newList
        }
      }
    });

  </script>

2.过滤器

2.1全局过滤器

  • 概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化。过滤器可以用在两个地方:mustache 插值和 v-bind 表达式。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符指示;
  • Note: <!-- 过滤器调用时候的格式    {{ name | 过滤器的名称 }} -->
  • 定义:
  • // 过滤器的定义语法
    Vue.filter('过滤器的名称', function(){})
    // 过滤器中的 function ,第一个参数,已经被规定死了,永远都是 过滤器 管道符前面 传递过来的数据
    Vue.filter('过滤器的名称', function (data) {
       return data + '123'
    })

 

  • 代码举例:
    •  
        <div id="app">
          <p>{{ msg | msgFormat('疯狂+1', '123') | test }}</p>
        </div>
      
        <script>
          // 定义一个 Vue 全局的过滤器,名字叫做  msgFormat
          Vue.filter('msgFormat', function (msg, arg, arg2) {
            // 字符串的  replace 方法,第一个参数,除了可写一个 字符串之外,还可以定义一个正则
            return msg.replace(/单纯/g, arg + arg2)
          })
      
          Vue.filter('test', function (msg) {
            return msg + '========'
          })
      
      
          // 创建 Vue 实例,得到 ViewModel
          var vm = new Vue({
            el: '#app',
            data: {
              msg: '曾经,我也是一个单纯的少年,单纯的我,傻傻的问,谁是世界上最单纯的男人'
            },
            methods: {}
          });
        </script>

       

2.2私有过滤器

  • 定义:// 定义私有过滤器    过滤器有两个 条件  【过滤器名称 和 处理函数
      // 过滤器调用的时候,采用的是就近原则,如果私有过滤器和全局过滤器名称一致了,这时候 优先调用私有过滤器
    •     var vm2 = new Vue({
            el: '#app2',
            data: {
              dt: new Date()
            },
            methods: {},
            filters: {
            // 定义私有过滤器    过滤器有两个 条件  【过滤器名称 和 处理函数】
            // 过滤器调用的时候,采用的是就近原则,如果私有过滤器和全局过滤器名称一致了,这时候 优先调用私有过滤器
            }
          })

3.字符串的padStart方法的使用(指定显示长度)

var m = (dt.getMonth() + 1).toString().padStart(2, '0')

4.自定义全局按键修饰符

  •  定义:
    • // 自定义全局按键修饰符
      Vue.config.keyCodes.f2 = 113

       

  •  使用:
    •  
      <input type="text" class="form-control" v-model="name" @keyup.f2="add">

       

  •  js 里面的键盘事件对应的键码

5.自定义指令

5.1自定义全局指令

5.1.1 自定义全局指令让文本框获取焦点

  • 使用:
    • <input type="text" class="form-control" v-model="keywords" id="search" v-focus>

       

  • 定义 
    // 使用  Vue.directive() 定义全局的指令  v-focus
    // 其中:参数1 : 指令的名称,注意,在定义的时候,指令的名称前面,不需要加 v- 前缀, 
    // 但是: 在调用的时候,必须 在指令名称前 加上 v- 前缀来进行调用
    //  参数2: 是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作
    Vue.directive('focus', {
      bind: function (el) { // 每当指令绑定到元素上的时候,会立即执行这个 bind 函数,只执行一次
        // 注意: 在每个 函数中,第一个参数,永远是 el ,表示 被绑定了指令的那个元素,这个 el 参数,是一个原生的JS对象
        // 在元素 刚绑定了指令的时候,还没有 插入到 DOM中去,这时候,调用 focus 方法没有作用
        //  因为,一个元素,只有插入DOM之后,才能获取焦点
        // el.focus()
      },
      inserted: function (el) {  // inserted 表示元素 插入到DOM中的时候,会执行 inserted 函数【触发1次】
        el.focus()
        // 和JS行为有关的操作,最好在 inserted 中去执行,放置 JS行为不生效
      },
      updated: function (el) {  // 当VNode更新的时候,会执行 updated, 可能会触发多次

      }
    })

5.1.2 自定义全局指令设置字体颜色(使用钩子函数的第二个参数)

    // 自定义一个 设置字体颜色的 指令
    Vue.directive('color', {
      // 样式,只要通过指令绑定给了元素,不管这个元素有没有被插入到页面中去,这个元素肯定有了一个内联的样式
      // 将来元素肯定会显示到页面中,这时候,浏览器的渲染引擎必然会解析样式,应用给这个元素
      bind: function (el, binding) {
        // 和样式相关的操作,一般都可以在 bind 执行
        el.style.color = binding.value
      }
    })

5.2 自定义私有指令

    // 如何自定义一个私有的过滤器(局部)
    var vm2 = new Vue({
      el: '#app2',
      data: {
        dt: new Date()
      },
      methods: {},
      filters: {},
      directives: { // 自定义私有指令
        'fontweight': { // 设置字体粗细的
          bind: function (el, binding) {
            el.style.fontWeight = binding.value
          }
        },
        'fontsize': function (el, binding) { // 注意:这个 function 等同于 把 代码写到了 bind 和 update 中去
          el.style.fontSize = parseInt(binding.value) + 'px'
        }
      }
    })

5.3 binding、update函数简写

directives: { // 自定义私有指令
        'fontweight': { // 设置字体粗细的
          bind: function (el, binding) {
            el.style.fontWeight = binding.value
          }
        },
        'fontsize': function (el, binding) { // 注意:这个 function 等同于 把 代码写到了 bind 和 update 中去
          el.style.fontSize = parseInt(binding.value) + 'px'
        }
      }
  • 注意:这个 function 等同于 把 代码写到了 bind 和 update 中去

6.Vue实例的生命周期

  • 什么是生命周期:从Vue实例创建、运行、到销毁期间,总是伴随着各种各样的事件,这些事件,统称为生命周期!
  • 生命周期钩子:就是生命周期事件的别名而已;
  • 生命周期钩子 = 生命周期函数 = 生命周期事件
  • 主要的生命周期函数分类:
  • 创建期间的生命周期函数:
    • beforeCreate:实例刚在内存中被创建出来,此时,还没有初始化好 data 和 methods 属性
    • created:实例已经在内存中创建OK,此时 data 和 methods 已经创建OK,此时还没有开始 编译模板
    • beforeMount:此时已经完成了模板的编译,但是还没有挂载到页面中
    • mounted:此时,已经将编译好的模板,挂载到了页面指定的容器中显示
  • 运行期间的生命周期函数:
    • beforeUpdate:状态更新之前执行此函数, 此时 data 中的状态值是最新的,但是界面上显示的 数据还是旧的,因为此时还没有开始重新渲染DOM节点
    • updated:实例更新完毕之后调用此函数,此时 data 中的状态值 和 界面上显示的数据,都已经完成了更新,界面已经被重新渲染好了!
  • 销毁期间的生命周期函数:
    • beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
    • destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
  • 图解:
    •  
  •  代码模板:
    •     // 创建 Vue 实例,得到 ViewModel
          var vm = new Vue({
            el: '#app',
            data: {
              msg: 'ok'
            },
            methods: {
              show() {
                console.log('执行了show方法')
              }
            },
            //创建时期的2个事件
            beforeCreate() { // 这是我们遇到的第一个生命周期函数,表示实例完全被创建出来之前,会执行它
              // console.log(this.msg)
              // this.show()
              // 注意: 在 beforeCreate 生命周期函数执行的时候,data 和 methods 中的 数据都还没有没初始化
            },
            created() { // 这是遇到的第二个生命周期函数
              // console.log(this.msg)
              // this.show()
              //  在 created 中,data 和 methods 都已经被初始化好了!
              // 如果要调用 methods 中的方法,或者操作 data 中的数据,最早,只能在 created 中操作
            },
      
            //挂载时期的2个事件
            beforeMount() { // 这是遇到的第3个生命周期函数,表示 模板已经在内存中编辑完成了,但是尚未把 模板渲染到 页面中
              // console.log(document.getElementById('h3').innerText)
              // 在 beforeMount 执行的时候,页面中的元素,还没有被真正替换过来,只是之前写的一些模板字符串
            },
            mounted() { // 这是遇到的第4个生命周期函数,表示,内存中的模板,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了
              // console.log(document.getElementById('h3').innerText)
              // 注意: mounted 是 实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,此时,如果没有其它操作的话,这个实例,就静静的 躺在我们的内存中,一动不动
            },
      
      
            // 接下来的是运行中的两个事件
            beforeUpdate() { // 这时候,表示 我们的界面还没有被更新【数据被更新了吗?  数据肯定被更新了】
              /* console.log('界面上元素的内容:' + document.getElementById('h3').innerText)
              console.log('data 中的 msg 数据是:' + this.msg) */
              // 得出结论: 当执行 beforeUpdate 的时候,页面中的显示的数据,还是旧的,此时 data 数据是最新的,页面尚未和 最新的数据保持同步
            },
            updated() {
              console.log('界面上元素的内容:' + document.getElementById('h3').innerText)
              console.log('data 中的 msg 数据是:' + this.msg)
              // updated 事件执行的时候,页面和 data 数据已经保持同步了,都是最新的
            }
      
            //销毁时期的2个事件
            beforeDestory(){
            
            },
            destoryed(){}
          });

       

7.使用vue-resource发起get、post、jsonp请求

  • vue-resource依赖于vue
  • 代码模板:
    •     // 创建 Vue 实例,得到 ViewModel
          var vm = new Vue({
            el: '#app',
            data: {},
            methods: {
              getInfo() { // 发起get请求
                //  当发起get请求之后, 通过 .then 来设置成功的回调函数
                this.$http.get('http://vue.studyit.io/api/getlunbo').then(function (result) {
                  // 通过 result.body 拿到服务器返回的成功的数据
                  // console.log(result.body)
                })
              },
              postInfo() { // 发起 post 请求   application/x-wwww-form-urlencoded
                //  手动发起的 Post 请求,默认没有表单格式,所以,有的服务器处理不了
                //  通过 post 方法的第三个参数, { emulateJSON: true } 设置 提交的内容类型 为 普通表单数据格式
                this.$http.post('http://vue.studyit.io/api/post', {}, { emulateJSON: true }).then(result => {
                  console.log(result.body)
                })
              },
              jsonpInfo() { // 发起JSONP 请求
                this.$http.jsonp('http://vue.studyit.io/api/jsonp').then(result => {
                  console.log(result.body)
                })
              }
            }
          });
       

8.jsonp的实现原理

  • 由于浏览器的安全性限制,不允许AJAX访问 协议不同、域名不同、端口号不同的 数据接口,浏览器认为这种访问不安全;
  • 可以通过动态创建script标签的形式,把script标签的src属性,指向数据接口的地址,因为script标签不存在跨域限制,这种数据获取方式,称作JSONP(注意:根据JSONP的实现原理,知晓,JSONP只支持Get请求);
  • 具体实现过程:
    • 先在客户端定义一个回调方法,预定义对数据的操作;
    • 再把这个回调方法的名称,通过URL传参的形式,提交到服务器的数据接口;
    • 服务器数据接口组织好要发送给客户端的数据,再拿着客户端传递过来的回调方法名称,拼接出一个调用这个方法的字符串,发送给客户端去解析执行;
    • 客户端拿到服务器返回的字符串之后,当作Script脚本去解析执行,这样就能够拿到JSONP的数据了;
  • 代码:
  • <script src="http://127.0.0.1:3000/getscript?callback=showInfo123"></script>
     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值