vue学习记录第三天

2018-11-21  本文已影响0人  大白熊_8133

悄咪咪的说讲课的老师说话声音好难听啊

复习

  1. v-else必须和v-if连用,中间不能有其他标签

事件修饰符

阻止事件传播

冒泡和捕获都会被阻止
@click.stop=""

事件捕获

事件捕获是从上到下,指不太具体的节点,比如window先接收到事件,最具体的节点最后接收到事件,在JS中将addEventListener的第二个参数改为true就会由捕获的方式获得最终的节点
vue中实现在父级加一个
@click.capture=""

  <body>
    <div id="app">
      <div @click.capture="parent">parent
        <div @click="child">child
          <div @click="grandson">grandson
          </div>
        </div>
      </div>

      </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
      let vm=new Vue({
        el:"#app",
        methods:{
          parent(){
            alert("parent")
          },
          child(){
            alert("child")
          },
          grandson(){
            alert("grandson")
          }
        },
        data:{

        }
      })
      </script>
  </body>

对于这段程序的执行结果应该是
alert(parent)
alert(grandson)
alert(child)
这是因为,点击grandson,parent开始捕获,但是child没有捕获,所以直接获得grandson,然后开始冒泡

阻止默认行为

@click.pervent=""

事件只绑定一次

@click.once=""

判断事件源绑定

@click.self=""

Vue构造函数

希望所有的实例都能使用过滤器,使用全局过滤器
要放在页面的顶部,不可以new完后再定义

Vue.filter('my',(data)=>{return data+'111'}

watch

computed不支持异步
好的是时候重温异步了
每次异步一定要拿出来说的东西就是setTimeout(),看以下的程序

    for(var i=0; i<3; i++){
        setTimeout(function(){
            i+=i;
            console.log(i);
        },1000)
    }
    var i = 1;
    console.log(i);

输出的结果是 1 2 4 8
原因是整个程序的运行顺序是,for先执行,setTimeout也进入队列三次,i到达3,然后执行var i=1,i被赋予值1,console.log(1),然后时间到了,三次setTimeout被执行

watch,computed以及methods的区别

  1. computed VS methods 计算属性是基于依赖进行缓存,依赖发生变化,才会重新计算,但是调用方法是在每次触发渲染时都会再次执行
  2. computed VS watch
    当有一些数据需要随着其他数据的变动而变动,使用computed
    当需要异步或者开销较大的操作的时候使用watch
    watch可以监控值的变化,在data中定义属性进行监控,watch中的属性名要和监控的属性名相同
watch:{
a(newVal,oldVal):{}
}

只有值变化才会变化,假如两次输入的值相同,并不会触发

watch另一种调用方法

vm.$watch('a',function(){})

动态绑定样式

v-bind

动态绑定“属性”

动态绑定class和style

第一种方法 对象

首先动态绑定的方式是:class, :class和class绑定的属性不冲突
绑定:{className:isActive}
多个类用逗号隔开

  <body>
    <div id="app">
      <!--{className:isActive}-->
      <div id="a" class="x" :class="{z:flag,y:!flag}">大白熊
        </div>
      </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
      let vm=new Vue({
        el:"#app",
        data:{
          flag:true
        }
      })
      </script>
  </body>

第二种数组

在data定义需要用的类,:class后用数组绑定
:class="[class1,class2,'z']"
或者:class="[class1,class2,{z:flag]"

<body>
    <div id="app">
      <!--{className:isActive}-->
      <div id="a" :class="[class1,class2,'z']">大白熊
        </div>
      </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
      let vm=new Vue({
        el:"#app",
        data:{
          class1:"x",
          class2:"y",
          flag:true
        }
      })
      </script>
  </body>

template

template标签,是vue提供的没有任何实际意义的标签,可以用来包裹元素,并且使用v-if,v-show并不支持

      <template v-if="false">
        <div>企鹅</div>
        <div>企鹅</div>
        <div>企鹅</div>
        <div>企鹅</div>
      </template>
      <div v-else>大白熊
        </div>

利用这个简单弄了一个注册登录界面切换

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    <style>
      .ui{
        width:500px;
        height:20px;
        list-style: none;
        margin:0;
        padding:0;
      }
      .ui li{
        width:70px;
        height:20px;
        margin-left:10px;
        float:left;
        text-align:center;
        background-color:lightblue;
        border:1px solid black;
        border-radius:5px 5px 0 0;
      }
      .ui li:hover
      {
        cursor:pointer
      }
      .content
      {
        width:500px;
        height:300px;
        margin-top:0;
        border:1px solid black;
      }
    </style>
  </head>

  <body>
    <div id="app">
     <ul class="ui">
       <li @click="flag=true">注册</li>
       <li @click="flag=false">登录</li>
       </ul>
      <div class="content">
        <template v-if="flag">
          <br>
          <label>用户名:</label>
          <input type="text" key="1">
          <br>
          <label>密码:</label>
          <input type="text" key="2">
          <br>
          <label>确认密码:</label>
          <input type="text">
        </template>
        <template v-else>
          <br>
          <label>用户名:</label>
          <input type="text" key="3">
          <br>
          <label>密码:</label>
          <input type="text" key="4">
        </template>
        </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
    new Vue(
    {
      el:"#app",
      data:{
        flag:true
      }
    }
    )
    </script>
  </body>
</html>

相同结构复用

默认情况下切换dom时相同的结构会被复用,如果不需要复用,加上key属性

上一篇下一篇

猜你喜欢

热点阅读