VUE学习笔记

VUE学习笔记

一:创建Vue

1.创建Vue

1.引入vue

<script type="text/javascript" src="../js/vue.js"></script>

2.创建vue

<body>
    <div class="root">
        <h1>hello,{{name}}</h1>
    </div>
    <div class="root">
        <h1>hello,{{name}}</h1>
    </div>
    
    <script type="text/javascript">
         Vue.config.productionTip = false;
        new Vue({
            el:'.root',//el用于指定vue实例为哪个容器服务,此处找上面id 用# ,找class 用 .   一般用id
            data:{
                name:'尚硅谷'
            }
        })
    </script>
</body>

3.解释

  • 首先引入vue的js文件
  • 在div或者其他块元素中设立class或者id,
  • 在script中创建new vue,并且用el绑定创建的id,分别用.或者#,data设立数据。

2.模板语法

1.插值语法

指取出data中的数据,{{xxx}}xxx为js表达式

<a :href="www.baidu.com">{{name}}</a>
2.指令语法

格式:a </ a>

同样xxx为js表达式

<a v-bind:href="www.baidu.com">链接</a>

3.数据绑定

单向绑定:v-bind 数据只能从data流向页面

双向绑定:v-model 还可以反过来流

注:双向绑定一般用在表单类元素上,如input、select、textarea等

​ v-model:value可以简写为v-model

4.el与data的两种写法

el:

  • 创建vue时指定el属性
  • 先创建实例,再通过vm.#mount(‘#root’)指定

data:

  • 对象式:data:{xxx}
  • 函数式:daa(){ return { xxx } }

注意vue函数一定不要写箭头函数

5.MVVM模型

M:模型Model

V:视图View

VM:ViewModel,Vue实例

6.数据代理

Object.defineproperty方法

    <script type="text/javascript">
        let obj1={x:100}
        let obj2={y:200}
        Object.defineProperty(obj2,'x',{
            get(){
				console.log("调取get方法")
                return obj1.x
            },
            set(value){
				console.log("调取set方法")
                obj1.x=value
            }
        })
    </script>

调试结果

obj1
{x: 100}

obj2.x
03数据代理.html:16 调取get方法
100

obj2.y
200

obj1.x=500
500

obj2.x=500
03数据代理.html:20 调取set方法
500

通过数据绑定,将obj1也绑定在obj2上,即也可以使用obj来调用obj1中的属性,并且obj2中修改可读取obj1中的属性时,使用的是obj2针对obj1自己单独的set和get方法,并不是obj1自己的set和get方法

总结:通过一个对象代理对另一个对象中的属性进行操作(读写)

7.事件的处理

1.基本用法
  • 使用 v-on : xxx 或者 @xxx绑定事件,其中xxx是事件名
<button v-on:click="showinfo1">点击事件1</button>
<button @click="showinfo1">点击事件2</button>
  • 事件的回调需要配置在methods对象中,最终会在vm上
new Vue({
            el:'#root',
            data:{
                name:'李四'
            },
            methods:{
                showInfo1(){
                    alert("同学你好")
                },
                showInfo(e){
                    alert("同学你好")
                }
            }
  • methods中配置的函数,不要使用箭头函数,否则this就不是vm了
  • methods中配置的函数,都是被Vue所管理的函数,this的指向是vm或组件实例对象
  • @click="demo"与@click="demo(#event)"效果一样,但是后者可以传参
<button v-on:click="showInfo1">点击提示信息1(不传参)</button>
<button @click="showInfo2(66,$event)">点击提示信息2(传参)</button>
 methods:{
                showInfo1(){
                    alert("同学你好")
                },
                showInfo2(number,a){
                    console.log(number,a)
                    alert("同学你好")
                }
            }
2.事件修饰符
  • prevent 阻止默认事件,如href的跳转
  • stop 阻止事件冒泡,相同事件多次触发
  • once 事件只触发一次
  • self 不常用
  • passive 不常用
  • capture 不常用
 <a href="http://www.baidu.com" @click.prevent="showInfo">点击事件</a>

修饰也可以连着写

 <a href="http://www.baidu.com" @click.prevent.stop="showInfo">点击事件</a>
3.键盘事件

每一个按键都有自己的编码

  • 常用的:enter、delete、esc、space、tab(必须配合keydown使用)、up、down、left、right、

  • vue未提供别名的按键,可以使用原始的key值绑定

  • 系统修饰键(用法特殊)ctrl、alt、shift、meta

    配合keyuo使用:按下修饰键的同时,再按其他键才能触发 @keyuo.ctr.y

    配合keydown使用:按下触发

  • Vue.config.keyCodes.自定义键名 = 键码

8.计算属性:computed

1.差值法实现
<body>
    <div id="root">
        姓:<input type="text" v-model="firstName" ></br>
        名:<input type="TEXT" v-model="lastName" ></br>
        全名:<span>{{firstName()}}{{lasttName()}}</span>
    </div>
    <script type="text/javascript">
        new Vue({
            el:'#root',
            data:{
                firstName:'张三',
                lastName:'李四'
            }
        })
    </script>
2.methods实现
<body>
    <div id="root">
        姓:<input type="text" v-model="firstName" ></br>
        名:<input type="TEXT" v-model="lastName" ></br>
        全名:<span>{{fullName()}}</span>
    </div>
    <script type="text/javascript">
        new Vue({
            el:'#root',
            data:{
                firstName:'张三',
                lastName:'李四'
            },
            methods:{
                    fullName(){
                        return this.firstName+"-"+this.lastName;
                }
            }
        })
    </script>
3.computed:计算属性
  • 要用的属性不存在,需要通过已有属性计算得来
  • 原理是借助了Object。defineproperty方法中的set、get方法实现
  • 优势是与methods相比,内部有缓存机制,可以复用,效率更高
<body>
    <!-- 已有的属性通过计算得来 -->
    <div id="root">
        姓:<input type="text" v-model="firstName" ></br>
        名:<input type="TEXT" v-model="lastName" ></br>
        全名:<span>{{fullName}}</span>
    </div>
    <script type="text/javascript">
        const vm = new Vue({
            el:'#root',
            data:{
                firstName:'张三',
                lastName:'李四'
            },
            computed:{
               fullName:{
                   //当有人读取fallName时,get就会被调用,且返回值为fullName的值
                   get(){
                       //此处的get调用只会在初调用时才会调用,或者讲所依赖的数据变化时,才会调用,其他时候会调用缓存
                        return this.firstName+"-"+this.lastName;
                   },
                   set(value){
                       const arr=value.split("-");
                        this.firstName=arr[0];
                        this.lastName=arr[1]
                   }
               }
               //简写-此处等价于上方,不为函数,为名称,且只能用于只考虑读取,不考虑写入时才能使用
               /*
                fullName(){//此处不为函数
                    return this.firstName+"-"+this.lastName;
                }
               */
           }
        })
    </script>

9.侦听属性:watch

侦察某一地方的属性或者方法被修改或者执行了

1.基本用法
  • 当被监听的属性发生变化时,回调函数自动调用,进行相关操作

  • 监视的属性必须存在,才可以使用,也可以监听计算属性

  • 配置项属性immedtate:false修改为true则初始化调用一次handler(newvalue,oldvalue)

  • 监视有两种写法

    1.创建vue时传入watch:{}配置

    2.通过vm.$watch()实现

<title>天气案例_监视属性</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h2>今天天气很{{info}}</h2>
  <button @click="changeWeather">切换天气</button>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  const vm = new Vue({
    el: '#root',
    data: {
      isHot: true,
    },
    computed: {
      info() {
        return this.isHot ? '炎热' : '凉爽'
      }
    },
    methods: {
      changeWeather() {
        this.isHot = !this.isHot
      }
    },
    // 方式一
    /* watch:{		
			isHot:{
				immediate:true,
				handler(newValue,oldValue){
					console.log('isHot被修改了',newValue,oldValue)
				}
			}
		} */
  })
  // 方式二
  vm.$watch('isHot', {		
    immediate: true, // 初始化时让handler调用一下
    //handler什么时候调用?当isHot发生改变时
    handler(newValue, oldValue) {
      console.log('isHot被修改了', newValue, oldValue)
    }
  })
</script>
2.深度监听

1.watch默认不检测对象内部值的改变(只监听一层)

2.watch中配置deep:true可以监测内部值(多层)

<title>天气案例_深度监视</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h3>a的值是:{{ numbers.a }}</h3>
  <button @click="numbers.a++">点我让a+1</button>
  <h3>b的值是:{{ numbers.b }}</h3>
  <button @click="numbers.b++">点我让b+1</button>
  <button @click="numbers = {a:666,b:888}">彻底替换掉numbers</button>
  {{numbers.c.d.e}}
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  const vm = new Vue({
    el: '#root',
    data: {
      isHot: true,
      numbers: {
        a: 1,
        b: 1,
        c: {
          d: {
            e: 100
          }
        }
      }
    },
    watch: {
      // 监视多级结构中某个属性的变化
      /* 'numbers.a':{
				handler(){
					console.log('a被改变了')
				}
			} */
      // 监视多级结构中所有属性的变化
      numbers: {
        deep: true,
        handler() {
          console.log('numbers改变了')
        }
      }
    }
  })
</script>
3.侦听属性的简写

如果侦听属性只有handler没有其他配置项的话可以简写为

    watch: {
       //正常写法
     isHot: {
       	 immediate:true, //初始化时让handler调用一下
       	 deep:true,	//深度监视
       	handler(newValue, oldValue) {
       		console.log('isHot被修改了', newValue, oldValue)
      	}
       },
      //简写
      isHot(newValue, oldValue) {
        console.log('isHot被修改了', newValue, oldValue, this)
      }
    }
  })

  //正常写法
   vm.$watch('isHot', {
   	immediate: true, //初始化时让handler调用一下
   	deep: true,//深度监视
   	handler(newValue, oldValue) {
   		console.log('isHot被修改了', newValue, oldValue)
   	}
   })l

  //简写
   vm.$watch('isHot', (newValue, oldValue) => {
   	console.log('isHot被修改了', newValue, oldValue, this)
   })
</script>

10计算属性与侦听属性的区别

  • computed能完成的功能,watch都可以完成,反之不一定
  • 所有被Vue管理的函数必须写城普通函数,这样this的指向才是vm或组件实例对象
  • 不被管理的函数(如定时器的回调、ajax的回调、promis的回调等)最好写成箭头函数,这样this的指向才是vm或组件实例对象

11绑定样式(class、style)

class样式

  • :class=“xxx”,xxx可以是字符串、数组、对象
  • :style=“[a,b]”,a、b是样式对象
  • :style="{fontSize:xxx}"其中xxx是动态值
  1. 字符串的写法适用于:类名不确定要动态获取

  2. 数组写法适用于:要绑定多个样式,个数不确定

  3. 对象写法适用于:要绑定多个样式,个数确定,名字也确定,但是不确定用不用

    <style>
      .basic {width: 300px;height: 50px;border: 1px solid black;}
      .happy {border: 3px solid red;background-color: rgba(255, 255, 0, 0.644);
        background: linear-gradient(30deg, yellow, pink, orange, yellow);}
      .sad {border: 4px dashed rgb(2, 197, 2);background-color: skyblue;}
      .normal {background-color: #bfa;}
      .atguigu1 {background-color: yellowgreen;}
      .atguigu2 {font-size: 20px;text-shadow: 2px 2px 10px red;}
      .atguigu3 {border-radius: 20px;}
    </style>
    
    <div id="root">
      <!-- 绑定class样式--字符串写法,适用于:样式的类名不确定,需要动态指定 -->
      <div class="basic" :class="mood" @click="changeMood">{{name}}</div><br/><br/>
    
      <!-- 绑定class样式--数组写法,适用于:要绑定的样式个数不确定、名字也不确定 -->
      <div class="basic" :class="classArr">{{name}}</div><br/><br/>
    
      <!-- 绑定class样式--对象写法,适用于:要绑定的样式个数确定、名字也确定,但要动态决定用不用 -->
      <div class="basic" :class="classObj">{{name}}</div><br/><br/>
    
      <!-- 绑定style样式--对象写法 -->
      <div class="basic" :style="styleObj">{{name}}</div><br/><br/>
    
      <!-- 绑定style样式--数组写法 -->
      <div class="basic" :style="styleArr">{{name}}</div>
    </div>
    
    <script type="text/javascript">
      Vue.config.productionTip = false
    
      const vm = new Vue({
        el: '#root',
        data: {
          name: '尚硅谷',
          mood: 'normal',
          classArr: ['atguigu1', 'atguigu2', 'atguigu3'],
          classObj: {
            atguigu1: false,
            atguigu2: false,
          },
          styleObj: {
            fontSize: '40px',
            color: 'red',
          },
          styleObj2: {
            backgroundColor: 'orange'
          },
          styleArr: [
            {
              fontSize: '40px',
              color: 'blue',
            },
            {
              backgroundColor: 'gray'
            }
          ]
        },
        methods: {
          changeMood() {
            const arr = ['happy', 'sad', 'normal']
            const index = Math.floor(Math.random() * 3)
            this.mood = arr[index]
          }
        },
      })
    </script>
    

12.条件渲染(v-if、v-show)

v-if:写法跟if else类似,适用于切换频率较低的场景

v-show:v-show=“表达式”,适用于切换频率较高的场景

注意:template标签不影响结构,但是html中不会有此标签,但只能配合v-f,不可以配合v-show

<title>条件渲染</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h2>当前的n值是:{{ n }}</h2>
  <button @click="n++">点我n+1</button>

  <!-- 使用v-show做条件渲染 -->
  <!-- <h2 v-show="false">欢迎来到{{name}}</h2> -->
  <!-- <h2 v-show="1 === 1">欢迎来到{{name}}</h2> -->

  <!-- 使用v-if做条件渲染 -->
  <!-- <h2 v-if="false">欢迎来到{{name}}</h2> -->
  <!-- <h2 v-if="1 === 1">欢迎来到{{name}}</h2> -->

  <!-- v-else和v-else-if -->
  <!-- <div v-show="n === 1">Angular</div> -->
  <!-- <div v-show="n === 2">React</div> -->
  <!-- <div v-show="n === 3">Vue</div> -->

  <!-- <div v-if="n === 1">Angular</div> -->
  <!-- <div v-else-if="n === 2">React</div> -->
  <!-- <div v-else-if="n === 3">Vue</div> -->
  <!-- <div v-else>哈哈</div> -->


  <!-- v-if与template的配合使用 -->
  <template v-if="n === 1">
    <h3>你好</h3>
    <h3>尚硅谷</h3>
    <h3>北京</h3>
  </template>

</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  const vm = new Vue({
    el:'#root',
    data:{
      name:'尚硅谷',
      n:0
    }
  })
</script>

13.列表渲染(v-for、、)

1.基本列表

v-for

用于展示列表数据

语法

<li v-for="(item,index) of items" :key=index> 

这里的key是遍历对象的唯一标识,一般为index

可遍历数组、对象、字符串、指定次数

<title>基本列表</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <!-- 遍历数组 -->
  <h3>人员列表(遍历数组)</h3>
  <ul>
    <li v-for="(p,index) of persons" :key="index">{{ p.name }}-{{ p.age }}</li>
  </ul>

  <!-- 遍历对象 -->
  <h3>汽车信息(遍历对象)</h3>
  <ul>
    <li v-for="(value,k) of car" :key="k">{{ k }}-{{ value }}</li>
  </ul>

  <!-- 遍历字符串 -->
  <h3>测试遍历字符串(用得少)</h3>
  <ul>
    <li v-for="(char,index) of str" :key="index">{{ char }}-{{ index }}</li>
  </ul>

  <!-- 遍历指定次数 -->
  <h3>测试遍历指定次数(用得少)</h3>
  <ul>
    <li v-for="(number,index) of 5" :key="index">{{ index }}-{{ number }}</li>
  </ul>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  new Vue({
    el: '#root',
    data: {
      persons: [
        { id: '001', name: '张三', age: 18 },
        { id: '002', name: '李四', age: 19 },
        { id: '003', name: '王五', age: 20 }
      ],
      car: {
        name: '奥迪A8',
        price: '70万',
        color: '黑色'
      },
      str: 'hello'
    }
  })
</script>

2.key的作用及其原理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

<title>key的原理</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h2>人员列表(遍历数组)</h2>
  <button @click.once="add">添加一个老刘</button>
  <ul>
    <li v-for="(p,index) of persons" :key="index">
      {{p.name}}-{{p.age}}
      <input type="text">
    </li>
  </ul>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  new Vue({
    el: '#root',
    data: {
      persons: [
        { id: '001', name: '张三', age: 18 },
        { id: '002', name: '李四', age: 19 },
        { id: '003', name: '王五', age: 20 }
      ]
    },
    methods: {
      add() {
        const p = { id: '004', name: '老刘', age: 40 }
        this.persons.unshift(p)
      }
    },
  })
</script>
3.列表的过滤

根据一定的条件,在目标数据中找出符合条件的部分数据

<title>列表过滤</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h2>人员列表</h2>
  <input type="text" placeholder="请输入名字" v-model="keyWord">
  <ul>
    <li v-for="(p,index) of filPersons" :key="p.id">
      {{ p.name }}-{{ p.age }}-{{ p.sex }}
    </li>
  </ul>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  // 用 watch 实现
  // #region 
  /* new Vue({
			el: '#root',
			data: {
				keyWord: '',
				persons: [
					{ id: '001', name: '马冬梅', age: 19, sex: '女' },
					{ id: '002', name: '周冬雨', age: 20, sex: '女' },
					{ id: '003', name: '周杰伦', age: 21, sex: '男' },
					{ id: '004', name: '温兆伦', age: 22, sex: '男' }
				],
				filPersons: []
			},
			watch: {
				keyWord: {
					immediate: true,
					handler(val) {
						this.filPersons = this.persons.filter((p) => {
							return p.name.indexOf(val) !== -1
						})
					}
				}
			}
		}) */
  //#endregion

  // 用 computed 实现
  new Vue({
    el: '#root',
    data: {
      keyWord: '',
      persons: [
        { id: '001', name: '马冬梅', age: 19, sex: '女' },
        { id: '002', name: '周冬雨', age: 20, sex: '女' },
        { id: '003', name: '周杰伦', age: 21, sex: '男' },
        { id: '004', name: '温兆伦', age: 22, sex: '男' }
      ]
    },
    computed: {
      filPersons() {
        return this.persons.filter((p) => {
          return p.name.indexOf(this.keyWord) !== -1
        })
      }
    }
  }) 
</script>
4.列表的排序
<title>列表排序</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h2>人员列表</h2>
  <input type="text" placeholder="请输入名字" v-model="keyWord">
  <button @click="sortType = 2">年龄升序</button>
  <button @click="sortType = 1">年龄降序</button>
  <button @click="sortType = 0">原顺序</button>
  <ul>
    <li v-for="(p,index) of filPersons" :key="p.id">
      {{p.name}}-{{p.age}}-{{p.sex}}
      <input type="text">
    </li>
  </ul>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  new Vue({
    el: '#root',
    data: {
      keyWord: '',
      sortType: 0, // 0原顺序 1降序 2升序
      persons: [
        { id: '001', name: '马冬梅', age: 30, sex: '女' },
        { id: '002', name: '周冬雨', age: 31, sex: '女' },
        { id: '003', name: '周杰伦', age: 18, sex: '男' },
        { id: '004', name: '温兆伦', age: 19, sex: '男' }
      ]
    },
    computed: {
      filPersons() {
        const arr = this.persons.filter((p) => {
          return p.name.indexOf(this.keyWord) !== -1
        })
        //判断一下是否需要排序
        if (this.sortType) {
          arr.sort((p1, p2) => {
            return this.sortType === 1 ? p2.age - p1.age : p1.age - p2.age
          })
        }
        return arr
      }
    }
  })
</script>
5.vue更新数组数据时的问题

修改数组中的的某个元素一定要用以下方法

push,pop,unshift,shift,splice,sort,reverse

<title>更新时的一个问题</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h2>人员列表</h2>
  <button @click="updateMei">更新马冬梅的信息</button>
  <ul>
    <li v-for="(p,index) of persons" :key="p.id">
      {{p.name}}-{{p.age}}-{{p.sex}}
    </li>
  </ul>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false

  const vm = new Vue({
    el: '#root',
    data: {
      persons: [
        { id: '001', name: '马冬梅', age: 30, sex: '女' },
        { id: '002', name: '周冬雨', age: 31, sex: '女' },
        { id: '003', name: '周杰伦', age: 18, sex: '男' },
        { id: '004', name: '温兆伦', age: 19, sex: '男' }
      ]
    },
    methods: {
      updateMei() {
        // this.persons[0].name = '马老师'	//奏效
        // this.persons[0].age = 50				//奏效
        // this.persons[0].sex = '男'			//奏效
        // this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} //不奏效
        this.persons.splice(0, 1, { id: '001', name: '马老师', age: 50, sex: '男' })
      }
    }
  })
</script>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

14收集表单数据v-model

  • 若则vmodel获取的是value值,即为用户输入的内容

  • 若则vmodel获取的是value值,即为标签的内容

    1. 没有配置value属性,则vmodel获取的是checked属性值
    2. 配置了value属性
    • 若v-model初始值是非数组,那么收集的是checked,布尔值
    • 是数组,那么收集的是value组成的数组
  • v-model的三个修饰符,例如 v-model.lazy=“infor”

  1. lazy:市区焦点后再收集数据
  2. number:输入字符串转为有效的数字
  3. trim:过滤首尾空格
<title>收集表单数据</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <form @submit.prevent="demo">
    账号:<input type="text" v-model.trim="userInfo.account"> <br /><br />
    密码:<input type="password" v-model="userInfo.password"> <br /><br />
    年龄:<input type="number" v-model.number="userInfo.age"> <br /><br />
    性别:
    男<input type="radio" name="sex" v-model="userInfo.sex" value="male"><input type="radio" name="sex" v-model="userInfo.sex" value="female"> <br /><br />
    爱好:
    学习<input type="checkbox" v-model="userInfo.hobby" value="study">
    打游戏<input type="checkbox" v-model="userInfo.hobby" value="game">
    吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat">
    <br /><br />
    所属校区
    <select v-model="userInfo.city">
      <option value="">请选择校区</option>
      <option value="beijing">北京</option>
      <option value="shanghai">上海</option>
      <option value="shenzhen">深圳</option>
      <option value="wuhan">成都</option>
    </select>
    <br/><br/>
    其他信息:
    <textarea v-model.lazy="userInfo.other"></textarea> <br/><br/>
    <input type="checkbox" v-model="userInfo.agree">阅读并接受
    <a href="https://www.yuque.com/cessstudy">《用户协议》</a>
    <button>提交</button>
  </form>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false

  new Vue({
    el: '#root',
    data: {
      userInfo: {
        account: '',
        password: '',
        age: 18,
        sex: 'female',
        hobby: [],
        city: 'beijing',
        other: '',
        agree: ''
      }
    },
    methods: {
      demo() {
        console.log(JSON.stringify(this.userInfo))
      }
    }
  })
</script>

15.过滤器

定义:对要显示的数据进行特定格式化之后再显示(适用于一些简单处理)

语法:如下

备注:过滤器也可以接受额外参数,多个过滤器也可以串联

​ 并没有改变原本的数据,是产生新的对应的数据

<div id="root">
			<h2>显示格式化后的时间</h2>
			<h3>现在是:{{time}}</h3>
			<!-- 计算属性实现 -->
			<h3>计算属性实现格式化后的时间:{{fmtTime}}</h3>
			<!-- methods实现 -->
			<h3>methods格式化后的时间:{{getFmtTime()}}</h3>
			<!-- 过滤器实现 -->
			<h3>过滤器实现格式化后的时间:{{time | timeFormater}}</h3>
			<!-- 过滤器传参实现 -->
			<h3>过滤器实现格式化后的时间:{{time | timeFormater('YYYY-MM-DD') |mySlice}}</h3>
		</div>
		<script type="text/javascript">
		//全局过滤器
			Vue.filter('myslice',function(value){
				return value.slice(0,4)
			})
		
			new Vue({
				el:'#root',
				data:{
					time:1621561377603
				},
				computed:{
					fmtTime(){
						return dayjs(this.time).format('YYYY-MM-DD HH:mm:ss')
					}
				},methods:{
					getFmtTime(){
						return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')
					}
				},filters:{
					// timeFormater(value){无参
					// 	return dayjs(this.time).format('YYYY年MM月DD日 HH:mm:ss')
					// }
					timeFormater(value,str="YYYY-MM-DD HH:MM:ss"){//传参
						return dayjs(this.time).format(str)
					},
					mySlice(value){
						return value.slice(0,4)//取前四位
					}
				}
			})
		</script>

16.内置指令

之前学过的指令

v-bind		单向数据绑定   
v-model		双向
v-for		遍历
v-on		绑定监听事件
v-show		条件渲染
v-if		条件渲染
v-else-if	条件渲染
v-else		条件渲染

新指令

v-text 想其所在节点中渲染文本内容,与插值语法的区别是会替换掉节点中的内容

//例如  
<div v-text="name"></div>	

v-html

作用:向指定节点总渲染包含html结构中的内容

与插值语法的区别是

  1. v-html会替换掉节点中所有内容,{{xxx}}不会
  2. v-html可以识别html结构

注意:v-html有严重的安全性问题,一定只能在可信的内容上使用

<div v-html="name"></div>	
<div v-html="str"></div>	
name=‘tom’
str=<a>{{name}}</>	正确用法

v-cloak

此指令没有值,本质是一个特殊属性,vue创建实例并接管容器后,会删掉此属性

使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}

<title>v-cloak指令</title>

<style>
  [v-cloak] {
    display:none;
  }
</style>

<div id="root">
  <h2 v-cloak>{{ name }}</h2>
</div>

// 够延迟5秒收到vue.js
<script type="text/javascript" src="http://localhost:8080/resource/5s/vue.js"></script>

<script type="text/javascript">
  console.log(1)
  Vue.config.productionTip = false
  new Vue({
    el:'#root',
    data:{name:'cess'}
  })
</script>

v-once

所在节点再初次动态渲染后就视为静态内容了,即为动态值静态化

以后数据的改变 不会引起v-once所在结构的更新,可以优化性能

<title>v-once指令</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h2 v-once>初始化的n值是: {{n}}</h2>
  <h2>当前的n值是: {{n}}</h2>
  <button @click="n++">点我n+1</button>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  new Vue({ el: '#root', data: {n:1} })
</script>

v-pre

跳过此所在节点的编译过程

即跳过没有使用指令语法、没有使用插值语法的节点,或加快编译

<title>v-pre指令</title>
<script type="text/javascript" src="../js/vue.js"></script>

<div id="root">
  <h2 v-pre>Vue其实很简单</h2>
  <h2 >当前的n值是:{{n}}</h2>
  <button @click="n++">点我n+1</button>
</div>

<script type="text/javascript">
  Vue.config.productionTip = false
  new Vue({ el:'#root', data:{n:1} })
</script>

自定义指令directives

定义语法

  1. 局部指令

    new Vue({															
      directives:{ 
        指令名:配置对象 
      }   
    })
    
    new Vue({															
      directives:{ 
        指令名:回调函数 
      }   
    })
    
  2. 全局指令

    Vue.directive(指令名, 配置对象)
    或
    Vue.directive(指令名, 回调函数)
    
    
    Vue.directive('fbind', {
        // 指令与元素成功绑定时(一上来)
        bind(element, binding) {	// element就是DOM元素,binding就是要绑定的
          element.value = binding.value
        },
        // 指令所在元素被插入页面时
        inserted(element, binding) {
          element.focus()
        },
        // 指令所在的模板被重新解析时
        update(element, binding) {
          element.value = binding.value
        }
    }
    

配置对象中常用的3个回调函数

bind(element,binding)—>指令与元素成功绑定时调用

inserted(element,binding)—>指令与所在元素被插入页面时调用

update(element,binding)—>指令所在模块结构被重新解析时调用

备注

  1. 指令定义时不加 v- ,但是使用时要加 v-
  2. 指令名如果是多个单词,要使用kebab-case命名方式,不要驼峰命名
new Vue({
	el: '#root',
	data: {
		n:1
	},
	directives: {
		'big-number'(element,binding) {
			element.innerText = binding.value * 10
		}
	}
})

">
Vue.config.productionTip = false
new Vue({ el:‘#root’, data:{n:1} })


**自定义指令directives**

定义语法

1. 局部指令

   ```js
   new Vue({															
     directives:{ 
       指令名:配置对象 
     }   
   })
   
   new Vue({															
     directives:{ 
       指令名:回调函数 
     }   
   })
  1. 全局指令

    Vue.directive(指令名, 配置对象)
    或
    Vue.directive(指令名, 回调函数)
    
    
    Vue.directive('fbind', {
        // 指令与元素成功绑定时(一上来)
        bind(element, binding) {	// element就是DOM元素,binding就是要绑定的
          element.value = binding.value
        },
        // 指令所在元素被插入页面时
        inserted(element, binding) {
          element.focus()
        },
        // 指令所在的模板被重新解析时
        update(element, binding) {
          element.value = binding.value
        }
    }
    

配置对象中常用的3个回调函数

bind(element,binding)—>指令与元素成功绑定时调用

inserted(element,binding)—>指令与所在元素被插入页面时调用

update(element,binding)—>指令所在模块结构被重新解析时调用

备注

  1. 指令定义时不加 v- ,但是使用时要加 v-
  2. 指令名如果是多个单词,要使用kebab-case命名方式,不要驼峰命名
new Vue({
	el: '#root',
	data: {
		n:1
	},
	directives: {
		'big-number'(element,binding) {
			element.innerText = binding.value * 10
		}
	}
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值