VUE基本使用

vue简介

  • vue.js的数据驱动视图是基于MVVM模型实现的
  • model 代表数据
  • view 代表视图模板
  • viewmodel 代表业务逻辑处理

数据驱动视图

  • 基于MVVM模型实现的数据驱动视图解放了DOM操作
  • view与model处理分离,降低代码耦合度
  • 双向绑定时的bug调试难度增大
  • 大型项目的view与model过多,维护成本高

组件化开发

  • 组件化开发,允许我们将网页功能封装为自定义HTML标签,复用书写自定义标签名即可
  • 组件不仅可以封装结构,还可以封装样式与逻辑代码,大大提高了开发效率与可维护性

vue实例

  • vue实例是通过vue函数创建的对象,是使用vue功能的基础

el选项

  • 用于选取一个DOM元素作为vue实例的挂载目标
  • 只有挂载元素内部才会被vue进行处理,外部为普通HTML元素
  • 代表MVVM中的view层

插值表达式

  • 挂载元素可以使用vue.js的模板语法,模块中通过插值表达式为元素进行动态内容设置,写法为{{}}
  • 插值表达式只能书写在标签内容区域,可以与其他内容混合
  • 内部只能书写js表达式,不能书写语句

data选项

  • data中的数据可以通过vm.$data.数据或vm.数据访问
  • data中的数据为响应式数据,在发生改变时,视图会自动更新
  • data中存在数组时,索引操作与length操作无法自动更新视图,这时可以借助vue.set()方法替代操作

methods选项

  • 用于存储需要在vue实例中使用的函数
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./lib/vue.js"></script>
</head>
<body>
  <div id="app">
    <ul>
      <!-- 插值表达式 -->
      <li>内容展示: {{10 + 2 + 3}}</li>
      <li>{{title}}</li>
      <li>{{fn(list)}}</li>
    </ul>
  </div>
  <script>
    var vm = new Vue({
      //el绑定元素
      el: '#app',
      data: {
        title: '标题文本',
        list: 'a-b-c-d'
      },
      methods: {
        fn(value){
          return value.split('-').join('')
        }
      }
    });

    console.log(vm.$el); 
    console.log(vm.title)
    // var vm = new Vue({});
    // vm.$mount('#app')
  </script>
</body>
</html>

指令

  • 指令本质就是html自定义属性

v-once

  • 使元素内部的插值表达式只生效一次
    <li v-once>{{title}}</li>
    

v-text

  • 元素内容整体替换为指定纯文本数据
    <li v-text="title"></li>
    

v-html

  • 元素内容整体替换为指定的html文本
    <li v-html="content"></li>
    data: {
      content: '<h1>aaa</h1>'
    },
    

v-bind 简写用 :

  • v-bind用于动态绑定HTML属性
  • 需要一次绑定多个属性,还可以绑定对象

class绑定

  • class是html属性,可以通过v-bind进行绑定,并且可以与class属性 共存
    <li :class="{b : isB,c : isC,'class-d' : true}"></li>
    <li :class="['a',{b : isB},'c']"></li>
    data: {
      isB : true,
      isC : true,
    },
    

style绑定

  • style是html属性,可以通过v-bind进行绑定,并且可以和style属性共存
  • 绑定样式的优先级大于固定样式
  • 可以通过数组给标签设置多个样式
    <p :style="styleObj">这是样式</p> 
    data: {
      styleObj: {
        width: '100px',
        height: '100px',
        backgroundColor: 'red',
      }
    }
    

v-for

  • 用于遍历数据渲染结构,常用的数组与对象均可遍历
  • 通过<template>标签设置模板占位符,可以将部分元素或内容作为整体进行操作
     <div id="app">
      <ul>
        <li v-for="(item, index) in itemList" :key="item.id">
          输入框{{ item.value }}: <input type="text">
        </li>
      </ul>
      <template v-for="item in obj">
        <span>{{ item }}</span>
        <br>
      </template>
    </div>
    <script src="lib/vue.js"></script>
    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          arr: [1, 2, 3],
          itemList: [
            {
              id: 1,
              value: 2
            },
            {
              id: 2,
              value:3
            },
            {
              id:3,
              value:3
            }
          ],
          obj: {
            content1: '内容1',
            content2: '内容2',
            content3: '内容3'
          }
        }
      })
    </script>
    

v-show

  • 用于控制元素显示与隐藏,适用于显示隐藏频繁切换时使用
  • <template>无法使用v-show指令

v-if

  • 用于根据条件控制元素的创建和移除
    <div id="app">
      <p v-if="false">这个元素不会创建</p>
      <p v-else-if="true">这个元素会创建</p>
      <p v-else>这个元素不会创建</p>
    </div>
    

事件处理

v-on 简写用@

  • 用于进行元素的事件绑定
  • 事件程序代码较多,可以在methods中设置函数,并设置为事件处理程序
  • 在视图中可以通过$event访问事件对象
    <div id="app">
      <p>{{content}}</p>
      <button v-on:click="content='这是点击内容'">点击</button>
      <button @click="fn">按钮</button>
      <button @click="fn($event)">按钮2</button>
    </div>
    <script>
      var vm = new Vue({
        //el绑定元素
        el: '#app',
        data: {
          content : '这是绑定的内容'
        },
        methods: {
          fn(event){
            this.content = "这是按钮3设置的内容"
            console.log(event)
          }
        }
      });
    </script>
    

v-model

  • 用于给<input>、<textarea>及<select>元素设置双向数据绑定

    <div id="app">
      <p>元素双向绑定:{{value}}</p>
     <input type="text" v-model="value">
    </div>
    <script>
      var vm = new Vue({
        //el绑定元素
        el: '#app',
        data: {
         value: '',
        }
      });
    </script>
    

单选按钮绑定

<div id="app">
    <p>radio的内容:{{value}}</p>
    <label for="one">选项一</label>
    <input type="radio" id="one" value="1" v-model="value">
    <label for="two">选项一</label>
    <input type="radio" id="two" value="2" v-model="value">
  </div>

修饰符

  • 修饰符是以点开头的指令后缀,用于给当前指令设置特殊操作

.prevent修饰符

  • 用来阻止默认事件行为,相当于event.preventDefault()
    <a @click.prevent href="https://kaiwu.lagou.com/">链接</a>
    

.stop修饰符

  • 用于阻止事件传播,相当于event.stopPropagation()
    <div @click="fn1">
      <!-- <button @click.stop="fn2">按钮</button> -->
      //只执行fn2,不会执行fn1
      <a @click.prevent.stop="fn2" href="https://kaiwu.lagou.com/">链接</a>
    </div>
    

.once修饰符

  • 用于设置事件只会触发一次
    <button @click.once="fn">按钮2</button>
    

按键修饰符

  • 按键码指的是将按键的按键码作为修饰符使用以标识按键的操作方式
  • 单独点击系统操作符无效
    <div id="app">
      <!-- <input type="text" @keyup="fn"> -->
      <!-- <input type="text" @keyup.49="fn"> -->  
      <!-- <input type="text" @keyup.esc="fn"> -->
      <input type="text" @keyup.a.b.c="fn">
    </div>
    <script src="lib/vue.js"></script>
    <script>
      new Vue({
        el: '#app',
        data: {
    
        },
        methods: {
          fn (event) {
            console.log(event);
            console.log('输入了对应内容');
          }
        }
      });
    

v-model修饰符

  • .trim修饰符 用于自动过滤用户输入内容首尾两端的空格
  • .lazy修饰符 用于将v-model的触发方式由input事件触发更改为change事件触发
  • .number修饰符 用于自动将用户输入的指转换为数值类型,如果无法被parseFloat()转换,则返回原始内容

自定义全局指令

  • 指的是可以被任意vue实例或组件使用的指令
    <input type="text" v-focus.a.b="100+1">
    <script>
      // 自定义全局指令
      Vue.directive('focus', {
        inserted (el, binding) {
          // console.log(el);
          console.log(binding);
          el.focus();
        }
      });
    </script>
    

自定义局部指令

  • 只能在当前vue实例或组件内使用
    <input type="text" v-focus>
    // 自定义局部指令
    new Vue({
      el: '#app',
      data: {},
      directives: {
        focus: {
          inserted (el) {
            el.focus();
          }
        }
      }
    });
    

全局过滤器

  • 全局过滤器可以在任意vue实例中使用
  • 过滤器能在插值表达式和v-bind中使用,通过管道符|连接数据
    <div id="app">
      <p :title="value | filterA">这是标签</p>
    </div>
    <script>
      //设置全局过滤器
      Vue.filter('filterA',function (value) {
        return value.split('-').join('')
      })
      var vm = new Vue({
        //el绑定元素
        el: '#app',
        data: {
         value: 'a-b-c',
         value2: []
        }
      });
    

局部过滤器

  • 局部过滤器只能在当前vue实例中使用
    <div id="app">
      <p :title="value | filterA">这是标签1</p>
    </div>
    <script>
      var vm = new Vue({
        //el绑定元素
        el: '#app',
        //局部过滤器
        filters:{
          filterA: function (value) {
            return value.split('-').join('')
          }
        },
        data: {
         value: 'a-b-c',
        }
      });
    </script>
    

计算属性

  • vue.js的视图不建议书写复杂逻辑,这样不利于维护
  • 计算属性使用时为属性形式,访问时会自动执行对应函数

methods与computed区别

  • computed具有缓存性,methods没有
  • computed通过属性名访问,methods需要调用
  • computed仅使用于计算操作

计算属性的setter

  • 计算属性默认只有getter,vue.js也允许给计算属性设置setter
    <div id="app">
      <p>{{fullname}}</p>
    </div>
    <script>
      var vm = new Vue({
        //el绑定元素
        el: '#app',
        data: {
          firstName: '张',
          lastName: '三'
        },
        computed: {
          // fullname(){
          //   return this.firstName + this.lastName
          // }
          fullname: {
            get(){
              return this.firstName + this.lastName
            },
            set(newValue){
              // console.log(newValue)
              var nameArr = newValue.split(' ');
              this.firstName = nameArr[0];
              this.lastName = nameArr[1];
            }
          }
        }
      });
    

侦听器

  • 侦听器用于监听数据变化并执行指定操作
  • 为了监听对象内部值的变化,需要将watch书写为对象,并设置选项deep:true,这时通过handler设置处理函数
  • 当更改数组和对象时,回调函数中的新值与旧值相同,因为它们的引用都指向同一个数组、对象
  • 数组操作不要使用索引与length,无法触发侦听器函数
    <div id="app">
      <input type="text" v-model="value">
      <p>{{value}}</p>
    </div>
    <script>
      var vm = new Vue({
        //el绑定元素
        el: '#app',
        data: {
          value:'',
        },
        watch: {
          value(){
            console.log('执行了侦听器')
          }
        }
      });
    </script>
    

vue DevTools

  • Vue.js官方提供的用来调试Vue应用的工具
  • 网页必须应用了Vue.js功能才能看到Vue DevTools
  • 网页必须使用Vue.js而不是Vue.min.js
  • 网页需要在http协议下打开,而不是使用file协议本地打开

生命周期

  • 通过设置生命周期函数,可以在生命周期的特定阶段执行功能
  • 初始化阶段
    • beforeCreate: 实例初始化之前调用
    • created:实例创建后调用
    • beforeMount: 实例挂载之前调用
    • mounted: 实例挂载完毕
  • 运行阶段
    • beforeUpdate: 数据更新后,视图更新前调用
    • updated: 视图更新后调用
  • 销毁阶段
    • beforeDestroy: 实例销毁之前调用
    • destroyed: 实例销毁后调用
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容