Vue语法基础

语法基础
  • v-cloak:
    1 差值表达式存在问题:闪动(性能较差时才会出现)
    2 利用v-cloak指令先隐藏,赋值好后再显示最终结果

       v-cloak指令的用法:
         1.提供样式
             [v-cloak]{
                 display:none;
             }
         2 在插值表达式所在的标签中添加v-cloak
    
  • 数据绑定指令
    1 v-text:填充纯文本,比插值表达式更简洁
    2 v-html:填充html片段,存在安全问题,内部网站可以用
    3 v-pre:显示原始信息,跳过编译过程

v-text:
       <div>{{msg}}</div>
       <div v-text='msg'></div> 
      下面与上面是一样的效果
v-html:
        <div v-html='msg1'></div>
...
data:{
  msg1 = '<h2>Hello</h2>'
}
作用:可以动态的生成html标签.缺点,容易遭到XSS攻击
  • 数据响应式
    就是指修改数据不用刷新浏览器,页面上的数据也会自动刷新
v-once:阻止再次编译,如果某个数据不需要响应式,可以使用v-once,提高性能
  • 双向数据绑定
    v-model

  • 事件绑定
    v-on:click(简写: @click)

1
<button @click='add'>add</button>
2
<button @click='add()'>add</button>

注:add是methosd里提供的方法

一个小坑:
箭头函数是不绑定this的,他会捕获上下文中的this,最为自己的this,所以,在Vue的methods中的函数,如果用的箭头函数,那可就会出现不能用this拿到Vue实例的情况。

  • 事件函数传参
    参数可以是某个普通值,也可以是事件对象
    传递事件对象的写法:
    $event,固定写法
    示例代码:
       <button @click='params(123,$event)'>hhh</button>
        params:function(data,event){
                    console.log(data);
                    console.log(event);//接收到的事件
                    
                }

注:
如果事件直接绑定函数名称,那么默认会传递事件对象作为事件函数的第一个参数。
如果事件绑定函数调用,那么事件对象必须作为最后一个参数传递,并且事件对象的名称必须是$event

  • 事件修饰符
    .stop:组织事件冒泡
    冒泡:
    举个例子:
<div @click='num++'> <button @click='num=1'>+</button> </div>

结果:num变成了2.我们明明是点击了button,num应该被赋值为了1,但是因为事件冒泡到了上层的div,触发了上层div的click事件,num被再次加了1,就成了2,有些时候,这并不是我们想要的结果,因此需要一个方法来阻止事件冒泡

传统的方式来阻止事件冒泡:
1 在click事件触发的函数中获取到事件对象event
2 为事件对象添加event.stopPropagation()
Vue阻止事件冒泡:
v-on:click.stop = 'fnName'

.prevent :阻止默认行为,比如a标签在点击的时候会默认发生跳转,可以用这个来阻止

  • 按键事件
    除了像是click这类似的鼠标事件之外呢,还是一些键盘事件,比如
    keyup,就是当按键被按下时触发
  • 按键事件修饰符
    eg:
<input @keyup.enter='enter' />
这个的意思是就是,当焦点在input里的时候,如果按下了enter键,就会触发enter函数

有些按键不在Vue提供的范围内,我们可以自己给他添加按键事件修饰符

  • Vue属性绑定
    eg :
    v-bind:href='url'
    就把该标签绑定来href属性,属性为data里的url的值
    简写::href='url'

  • Vue样式绑定
    1 class样式处理
    (1)对象形式

       <div v-bind:class='{active:isActive,danger:isDanger}'></div>
        然后我们需要去data里设置isDanger和isActive属性,布尔值类型
        而active和danger则是具体的css类名
        也可以直接:
      <div v-bind:class='objClassName'></div>
      objClassName:{
        active:true,
        danger:false
      }

(2)数组形式

       <div v-bind:class='[activeClass,dangerClass]'></div>
      data里:
          activeClass:'active',
          dangerClass:'danger'
  • 分支结构
    v-if:控制元素是否被渲染到页面
    v-show:控制元素是否显示(已经渲染)
    如果一个元素需要频繁的显示和隐藏,则推荐用v-show,否则用v-if
  • 循环结构
    v-for:
        <li v-for = '(item,index) in list'>{{item + '---' + index}}</li>
list是data中的一个数组

为了能有更好的性能,我们最高在遍历时为元素加上key

  <li v-bind:key='item.index' v-for = '(item,index) in list'>{{item + '---' + index}}</li>
  • 自定义指令
    eg:
    1 如果我们需要设置一个v-focus,让被绑定该指令的元素获得焦点
    2 设置一个指令v-color,来改变当前元素颜色
      <input type="text" v-focus v-model='msg' v-color='{color:"blue"}'>
        Vue.directive('focus',{
            inserted:function(el){//el表示指令所绑定的元素
                el.focus()
            }
        })

        //自定义属性2:改变当前元素的颜色  带参数
        Vue.directive('color',{
            inserted:function(el,binding){
                el.style['background-color'] = binding.value.color;
            }
        })

以上两种指令的定义都是全局的,我们还可以定义局部指令:


image.png

这样的局部指令应该定义在组件内部(Vue实例也是一个组件),只能在本组件中使用

  • 计算属性
    实际场景:
<!-- 反转msg -->
 {{msg.split("").reverse().join('')}} 

我们需要把msg先反转,再展示到页面中,直接再{{}}内写相关逻辑,会导致代码不便于阅读。因此要用到计算属性.使用方法:

{{reverseMethod}}

computed:{
                reverseMethod:function(){
                    return this.msg.split('').reverse().join('');
                }
            }

计算属性就是基于data中的数据来做处理的,data里的数据变了,计算属性的结果也会自动改变。

  • methods和computed的区别
    缓存上的差异。方法不存在缓存,计算属性是有缓存的
    举个例子:
{{reverseMethod}}
{{reverseMethod}}
computed:{
                reverseMethod:function(){
                    console.log('happy')
                    return this.msg.split('').reverse().join('');
                }
            }

这个例子中,happy只会被打印一次,如果使用方法来完成相应功能,happy会被打印两次。
缓存好处:节省性能

  • 侦听器


    image.png

    应用场景:
    数据变化时执行异步或开销大的操作
    一个模拟:

<div id="box">
        <span>请输入用户名:</span>
        <input type="text" v-model.lazy='uname'>
        <span>{{tips}}</span>
    </div>

    <script>
        var vim = new Vue({
            el:'#box',
            data:{
                uname:'',
                tips:''
            },
            methods:{
                checkName:function(uname){
                    var _this = this
                    setTimeout(function(){
                        if(uname === 'hah'){
                            _this.tips = '已经存在该用户名,请重新输入'
                        }else{
                            _this.tips = '该用户名可用'
                        }
                    },2000)
                }
            },
            watch:{
                uname:function(val){
                    this.checkName(val);
                    this.tips = 'waitting...'
                }
            }
        })
    </script>
  • 过滤器
    作用:格式化数据,如:将字符串格式转换成首字母大写,或是指定日期格式等

    自定义过滤器:

Vue.filter('过滤器名称',function(value){
            //业务逻辑代码
        })

eg:

<input type="text" v-model='msg'>
<div>{{msg | upper}}</div> //Vue过滤器的使用方法1 (插值表达式)
<div v-bind:id="msg | upper">hhh</div> //使用方法2 (属性绑定)
Vue.filter('upper',function(value){
            //将语句转化为每个单词首字母大写的办法.
            var result = []
            value = value.split(' ');           
            for(var i=0;i<value.length;i++){
                var tool = ''
                var tools = value[i].toUpperCase()              
                tool += tools[0]
                tools = tools.toLowerCase();
                for(var j = 1; j < tools.length;j++){
                    tool += tools[j];
                }
                result.push(tool)
            }
            result =  result.join(' ')
            return result
        })

注:也可以定义局部过滤器

  • 带参数的过滤器
    在filter定义时,回调函数中的第一个参数时默认的,时传入的数据,而我们认为进行传参的话,传入的参数是第二个参数
<div>{{date | format('yyyy-MM-dd')}}</div>
Vue.filter('test',function(val,params){
            //逻辑代码
        })
  • Vue生命周期
    主要阶段:(8个钩子函数)
    1 挂载(初始化相关属性)
    1)beforeCreate
    2)created
    3)beforeMount
    4)mounted
    2 更新(元素或组件的变更操作)
    1)beforeUpdate
    2)updated
    3 销毁(销毁相关属性)
    1)beforedestory
    2)destoryed

比如,我们向页面中填充数据,需要保证页面中已经有模板内容了,就需要用到mounted钩子函数

  • Vue数组操作


    image.png

    变异方法直接使用,替换数组不会自动更新数据,要把结果传递给自己

数组的响应化:(不用v-model却可以自动更新数据)
Vue.set(vm.items,indexOfItem,newValue);
vm.$set(vm.items,indexOfItem,newValue);
参数一:要处理的数组名称
参数二:要处理的数组索引
参数三:要处理的数组的值

注:Vue中,直接操作对象是不能响应化的,同样可以用操作数组的方法来操作对象。只是在索引那里,不再是数字,而是key字符串。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336