Web前端之路让前端飞Vue.js专区

Vue.js学习笔记(三)--来自于慕课网的入门实战教程

2017-06-02  本文已影响148人  430e88caaec1

还在更新中,,如果你还在入门vue,欢迎阅读
21、
因为HTML默认对大小写不敏感,所以,我们在模板(template)中写组件的时候,建议使用中间带有横线的格式,例如:

我注册了两个组件:

components: {
  ComA,
  comAHasSomeChildren
}

此时,我使用这两个组件的时候,建议用中线,例如:

<template>
    <com-a></com-a>
    <com-a-has-some-children></com-a-has-some-children>
</template>

也就是说,每次遇到了一个大写,都要用 - 来进行分隔,并且都写成小写(同理,属性也是建议这种格式)。

在vue1.0如果不用这种格式是会报错的,但是vue2.0支持写成<ComA>、<comAHasSomeChildren>。因为它会转化为建议的那种格式。

22、

可以使用is标签动态的使用组件

23、

父组件要把他的一些值(例如number)传递给子组件,可以在子组件里面使用props选项来获取,并且在data里面不需要再声明它了。

在methods也可以通过this.number来使用它

假设,我在父组件里面使用了子组件,我可以在父组件里面的子组件标签里面写入需要传递的值

例如:

<!--这是在父组件的app.vue文件里面-->
<template>
    <div>
        <!--向子组件传递这个number-->
        <com-a number=2></com-a>
    </div>
</template>

<!--这是子组件所在的文件a.vue-->
<template>
    <div>
        <p>{{content}}</p>
        <p>我是来自·父组件的{{number}}</p>
    </div>
</template>

<script type="text/javascript">
    export default{
        props:['number'],
        data: function(){
            return {
                content: 'I am a component'
            }
        },
    }
</script>

注意一点,传递给子组件的那个值它要用中线的格式,不要用驼峰命名的格式,例如,

<!--这是父组件所在的app.vue文件-->
<component-a num-to-do=3></component-a>

<!--这是子组件所在的a.vue文件-->
props:['num-to-do']

<!--这是a.vue文件,接下来使用传递过来的值-->
<template>
    <div>
        <p>我是来自·父组件的{{numToDo}}</p>
    </div>
</template>

注意到,在这里会有一个转换,因为num-to-do不符合js变量的命名,所以它会转换成numToDo

{{}}里面放的是js变量

还可以使用slot(插条)来传递,例如代码中的那个<p>我将被插入子组件中</p>

<!--这是父组件所在的app.vue文件-->
<template>
  <div>
      <component-a num-to-do=3>
        <p>我将被插入子组件中</p>
      </component-a>
  </div>
</template>
<script>
import componentA from './components/a.vue' //引入这个a组件,组件名为from前面的名字componentA

export default{
  components:{componentA},//在引入之前,要先在当前的组件里先注册这个组件,这句话其实是ES6的缩写,他原来是{componentA:componentA}
  data: function(){
    return {
      myValue: '',
      newValue: '',
      oldValue: ''
    }
  },
}
</script>

<!--这是子组件所在的a.vue文件-->
<template>
    <div>
        <p>{{content}}</p>
        <p>我是来自·父组件的{{numToDo}}</p>
        <slot></slot>
    </div>
</template>

<script type="text/javascript">
    export default{
        props:['num-to-do'],
        data: function(){
            return {
                content: 'I am a component'
            }
        },
    }
</script>

如果在子组件里有多个slot,可以在父组件里面指定插入到那个slot里面

24、过渡的效果(使用css实现)

<transition></transition>配合v-show这样的指令来实现,例如:

    <!--这是app.vue文件-->
    <template>
      <div>
          <button v-on:click="toggle">切换</button>
          <transition name="my-trans">
            <p v-show='isShow'>hello</p>
          </transition>
      </div>
    </template>
    <script>
    import componentA from './components/a.vue' //引入这个a组件,组件名为from前面的名字componentA
    
    export default{
      components:{componentA},//在引入之前,要先在当前的组件里先注册这个组件,这句话其实是ES6的缩写,他原来是{componentA:componentA}
      data: function(){
        return {
          isShow: true,
        }
      },
      methods:{
        toggle(){
          this.isShow = !this.isShow;
        }
      }
    }
    </script>
    <style type="text/css">
    .my-trans-enter-active, .my-trans-leave-active{
      transition: .5s;
    }
    .my-trans-enter{
      transform:translateY(-500px);
      opacity: 0;
    }
    .my-trans-leave-active{
      transform: translateY(500px);
      opacity: 0;
    }
    </style>

分析:

过渡用四种状态:enter、enter-active、leave、leave-active

<transition name="my-trans">标签中的name值是可以任意取的,但是,对应的类名是要更改的,例如:

    <style type="text/css">
    .my-trans-enter-active, .my-trans-leave-active{
      transition: .5s;
    }
    .my-trans-enter{
      transform:translateY(-500px);
      opacity: 0;
    }
    .my-trans-leave-active{
      transform: translateY(500px);
      opacity: 0;
    }
    </style>

因为<transition name="my-trans">标签中的name值是my-trans,所以,类名的定义要加上前缀my-trans,否则会但不到动画

不要漏了transition的时间,否则看不到切换的那个过程(动画)

25、动态的切换组件的显示

我们得把要切换的组件的挂载点放在<transition></transition>里面,例如:
    <template>
      <div>
          <button v-on:click="toggleCom">切换</button>
          <transition name="my-trans">
            <div v-bind:is="currentView"></div>
          </transition>
      </div>
    </template>
    <script>
    import componentA from './components/a.vue' //引入这个a组件,组件名为from前面的名字componentA
    import componentB from './components/b.vue'
    
    export default{
      components:{componentA, componentB},//在引入之前,要先在当前的组件里先注册这个组件,这句话其实是ES6的缩写,他原来是{componentA:componentA}
      data: function(){
        return {
          currentView: 'component-b',
          isShow: true,
        }
      },
      methods:{
        toggleCom(){
          if(this.currentView === 'component-a'){
            this.currentView = 'component-b';
          }
          else{
            this.currentView = 'component-a';
          }
        }
      }
    }
    </script>
    <style type="text/css">
    .my-trans-enter-active, .my-trans-leave-active{
      transition: .5s;
    }
    .my-trans-enter{
      transform:translateY(-500px);
      opacity: 0;
    }
    .my-trans-leave-active{
      transform: translateY(500px);
      opacity: 0;
    }
    </style>

如果我们只写成这样,我们会发现一个问题,比如所a组件还没有完全消失,b组件就跟着进来了(因此会有b组件下浮又上升的过程)。我们可以做如下修改:

<transition name="my-trans" mode="out-in">

此时,我们很容易的想到,有没有in-out呢?

答案是有的,如果改成:

<transition name="my-trans" mode="in-out">

那么,当另一个组件完全显示出来了,另一个组件才会消失

26、多元素的过渡,如果两个元素的标签名是相同的,那么在vue里面是不会有动画效果的,例如:

    <template>
      <div>
          <button v-on:click="toggleCom">切换</button>
          <transition name="my-trans" mode="out-in">
            <p v-if="show">
              I am show
            </p>
            <p v-else>
              not in show
            </p>
          </transition>
      </div>
    </template>

我们可以添加key来进行区分,例如:

    <template>
      <div>
          <button v-on:click="toggleCom">切换</button>
          <transition name="my-trans" mode="out-in">
            <p v-if="show" key="1">
              I am show
            </p>
            <p v-else key="2">
              not in show
            </p>
          </transition>
      </div>
    </template>

注意,这里不是只能写key!!!这样也可以:

    <transition name="my-trans" mode="out-in">
      <p v-if="isShow" index="">I am show</p>
      <p v-else key="">not in show</p>
    </transition>

27、过渡的效果(使用js实现,使用时间钩子)

(这种方法可以使用第三方库,例如jquery,建议把jquery的引入放在最外层的那个index.html文件里面)

使用js实现的时候,在<transition>标签里面是不需要name的,但是需要加上v-bind:css="false"

    <template>
      <div>
          <button v-on:click="isShow = !isShow">切换</button>
          <transition
          v-on:before-enter="beforeEnter"
          v-on:enter="enter"
          v-on:leave="leave"
          v-bind:css="false">
            <p class="animate-p" v-show="isShow">hello</p>
          </transition>
      </div>
    </template>
    <script>
    import Vue from 'vue'
    import componentA from './components/a.vue' //引入这个a组件,组件名为from前面的名字componentA
    import componentB from './components/b.vue'
    
    export default{
      components:{componentA, componentB},//在引入之前,要先在当前的组件里先注册这个组件,这句话其实是ES6的缩写,他原来是{componentA:componentA}
      data: function(){
        return {
          currentView: 'component-b',
          isShow: true,
        }
      },
      methods:{
        beforeEnter: function(el){//其中的el指的是animate-p这个元素
          $(el).css({
            left: '-500px',
            opacity: 0
          });
        },
        enter: function(el, done){
          $(el).animate({
            left: 0,
            opacity: 1
          }, {
            duration: 1500,
            complete: done
          });
        },
        leave: function(el, done){//这里的done方法不能漏了,否则会出错
          $(el).animate({
            left: '500px',
            opacity: 0
          }, {
            duration: 1500,
            complete: done
          });
        }
      }
    }
    </script>
    <style type="text/css">
    html{
      height: 100%;
    }
    body{
      display: flex;
      align-items: center;
      justify-content: center;
      height: 100%;
    }
    .animate-p{
      position: absolute;
      top: 0;
      left: 0;
    }
    </style>

28、自定义指令(分为局部的和全局的)

使用选项directives,例如:

directives: {
  color: function(el, binding){
    el.style.color = binding.value
  }
}

这样就自定义了一个指令 v-color,它会是文字变成指令的值的颜色,具体的使用方法如下:

//这是app.vue文件
<template>
  <div>
      <p v-color="'red'">hello world</p>
  </div>
</template>
<script>
import Vue from 'vue'
import componentA from './components/a.vue' //引入这个a组件,组件名为from前面的名字componentA
import componentB from './components/b.vue'

export default{
  components:{componentA, componentB},//在引入之前,要先在当前的组件里先注册这个组件,这句话其实是ES6的缩写,他原来是{componentA:componentA}
  data: function(){
    return {
      currentView: 'component-b',
      isShow: true,
    }
  },
  directives: {
    color: function(el, binding){
      el.style.color = binding.value;
    }
  }
}
</script>
<style type="text/css">
html{
  height: 100%;
}
body{
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}
</style>

<p v-color="'red'">hello world</p>

注意这里的 ‘red’ 两边是需要加双引号的,如果没加,例如下面的样子会报错:

<p v-color="red">hello world</p>

以上是局部指令,也就是只能在app.vue文件中使用

如果需要写成全局指令,那么上面的内容就要写到main.js文件里

或许有人会问自定义指令有什么用,让字变成红色用v-bind内置的指令一样也可以做到啊。但是如果要实现光标自动聚焦的效果,Vue就用内置的指令实现不了了,但是可以使用自定义指令实现:

<template>
  <div>
      <p v-color="'red'">hello world</p>
      <input type="text" name="text" v-focus>
  </div>
</template>
<script>
import Vue from 'vue'
import componentA from './components/a.vue' //引入这个a组件,组件名为from前面的名字componentA
import componentB from './components/b.vue'

export default{
  components:{componentA, componentB},//在引入之前,要先在当前的组件里先注册这个组件,这句话其实是ES6的缩写,他原来是{componentA:componentA}
  data: function(){
    return {
      currentView: 'component-b',
      isShow: true,
    }
  },
  directives: {
    color: function(el, binding){
      el.style.color = binding.value;
    },
    focus: {
      inserted(el, binding){
        el.focus();

      }
    }
  }
}
</script>
<style type="text/css">
html{
  height: 100%;
}
body{
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}
</style>
上一篇 下一篇

猜你喜欢

热点阅读