学习Vue第二天

Posted 前端世界升级打怪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习Vue第二天相关的知识,希望对你有一定的参考价值。

学习Vue第二天


今天学习了vue的生命周期,动画,过滤器,指令,插件。


一:Vue生命周期


Vue生命周期分为三大阶段:初始化阶段,更新显示阶段,死亡阶段。

 

其中初始化显示阶段对应着 beforeCreate(),created(),beforeMount(),mounted挂载阶段;

更新显示阶段对应着 beforeUpdate(),updated阶段。

死亡对应着beforeDestory(),Destoryed()阶段。

常用的生命周期方法有:

mounted:发送ajax请求,启动定时器等异步任务。

beforeDestory():做收尾工作,如:消除定时器。(处理内存泄漏文体)

<div id="test">
  <button @click="destroyVue">destory vue</button>
  <p v-if="isShow">哈哈哈</p>
</div>

<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
  new Vue({
    el: '#test',
    data: {
      isShow: true
    },

    beforeCreate() {
      console.log('beforeCreate()')
    },

    created() {
      console.log('created()')
    },

    beforeMount() {
      console.log('beforeMount()')
    },

    mounted () {
      console.log('mounted()')
      // 执行异步任务
      this.intervalId = setInterval(() => {
        console.log('-----')
        this.isShow = !this.isShow
      }, 1000)
    },


    beforeUpdate() {
      console.log('beforeUpdate()')
    },
    updated () {
      console.log('updated()')
    },


    beforeDestroy() {
      console.log('beforeDestroy()')
      // 执行收尾的工作
      clearInterval(this.intervalId)
    },

    destroyed() {
      console.log('destroyed()')
    },

    methods: {
      destroyVue () {
        this.$destroy()
      }
    }
  })


</script>

二:动画


使用trasition实现过渡效果,animation实现动画效果。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>10_过渡&动画1</title>
  <style>
    /*指定过渡样式*/
    .xxx-enter-active, .xxx-leave-active {
      transition: opacity 1s
    }
    /*指定隐藏时的样式*/
    .xxx-enter, .xxx-leave-to {
      opacity: 0;
    }


    .move-enter-active {
      transition: all 1s
    }

    .move-leave-active {
      transition: all 3s
    }

    .move-enter, .move-leave-to {
      opacity: 0;
<!--设置位置-->
      transform: translateX(20px)
    }
  </style>
</head>
<body>
<!--
实现文字的显示与隐藏


1. vue动画的理解
  操作css的trasition或animation
  vue会给目标元素添加/移除特定的class
2. 基本过渡动画的编码
  1). 在目标元素外包裹<transition name="xxx">
  2). 定义class样式
    1>. 指定过渡样式: transition
    2>. 指定隐藏时的样式: opacity/其它
3. 过渡的类名
  xxx-enter-active: 指定显示的transition
  xxx-leave-active: 指定隐藏的transition
  xxx-enter: 指定隐藏时的样式
-->



<div id="demo">
  <button @click="show = !show">Toggle</button>
  <transition name="xxx">
    <p v-show="show">hello</p>
  </transition>
</div>

<hr>
<div id="demo2">
  <button @click="show = !show">Toggle2</button>
  <transition name="move">
    <p v-show="show">hello</p>
  </transition>
</div>


<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
  new Vue({
    el: '#demo',
    data: {
      show: true
    }
  })

  new Vue({
    el: '#demo2',
    data: {
      show: true
    }
  })

</script>
</body>
</html>

案例二:实现标签体内容的放大与缩小

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>10_过渡&动画2</title>
  <style>
    .bounce-enter-active {
      animation: bounce-in .5s;
    }
    .bounce-leave-active {
<!--reverse的作用是把下面实现的效果反过来执行,实现内容的放大与缩小-->
      animation: bounce-in .5s reverse;
    }
    @keyframes bounce-in {
      0% {
        transform: scale(0);
      }
      50% {
        transform: scale(1.5);
      }
      100% {
        transform: scale(1);
      }
    }
  </style>
</head>
<body>

<div id="example-2">
  <button @click="show = !show">Toggle show</button>
  <br>
  <transition name="bounce">
<!--设置行内联元素的作用是为了消除显示内容由于放大溢出屏幕的bug-->
    <p v-if="show" style="display: inline-block">Lorem</p>
  </transition>
</div>

<script type="text/javascript" src="../js/vue.js"></script>
<script>
  new Vue({
    el: '#example-2',
    data: {
      show: true
    }
  })
</script>
</body>
</html>

三:过滤器


过滤器:对显示的数据进行格式化。

1). 定义过滤器
        Vue.filter(filterName, function(value[,arg1,arg2,...]){
          // 进行一定的数据处理
          return newValue
        })
    2). 使用过滤器
        <div>{{myData | filterName}}</div>
        <div>{{myData | filterName(arg)}}</div>

<div id="test">
  <h2>显示格式化的日期时间</h2>
  <p>{{time}}</p>
  <p>最完整的: {{time | dateString}}</p>
  <p>年月日: {{time | dateString('YYYY-MM-DD')}}</p>
</div>

<script type="text/javascript" src="../js/vue.js"></script>
//这里需要引入moment库,可以在CDN中引入
<script type="text/javascript" src="https://cdn.bootcss.com/moment.js/2.22.1/moment.js"></script>
<script>
  // 定义过滤器
  Vue.filter('dateString', function (value, format='YYYY-MM-DD HH:mm:ss') {

    return moment(value).format(format);
  })


  new Vue({
    el: '#test',
    data: {
      time: new Date()
    },
    mounted () {
      setInterval(() => {
        this.time = new Date()
      }, 1000)
    }
  })
</script>

四:指令


常用内置指令

  v:text : 更新元素的 textContent

  v-html : 更新元素的 innerHTML

  v-if : 如果为true, 当前标签才会输出到页面

  v-else: 如果为false, 当前标签才会输出到页面

  v-show : 通过控制display样式来控制显示/隐藏

  v-for : 遍历数组/对象

  v-on : 绑定事件监听, 一般简写为@

  v-bind : 强制绑定解析表达式, 可以省略v-bind

  v-model : 双向数据绑定

  ref : 为某个元素注册一个唯一标识, vue对象通过$refs属性访问这个元素对象

  v-cloak : 使用它防止闪现表达式, 与css配合: [v-cloak] { display: none }

  <style>
    [v-cloak] { display: none }
  </style>
<div id="example">
  <p v-cloak>{{content}}</p>
  <p v-text="content"></p>   <!--p.textContent = content-->
  <p v-html="content"></p>  <!--p.innerHTML = content-->
  <p ref="msg">abcd</p>
  <button @click="hint">提示</button>
</div>

<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
  new Vue({
    el: '#example',
    data: {
      content: '<a href="http://www.baidu.com">百度一下</a>'
    },
    methods: {
      hint () {
        alert(this.$refs.msg.innerHTML)
      }
    }
  })

自定义指令

1). 注册全局指令
    Vue.directive('my-directive', function(el, binding){
      el.innerHTML = binding.value.toUpperCase()
    })

el:指令属性所在的标签对象

binding:包含指令相关信息数据的对象。

2). 注册局部指令
    directives : {
      'my-directive' : function(el, binding) {
          el.innerHTML = binding.value.toUpperCase()
      }
    }

3). 使用指令
    <div v-my-directive='xxx'>


 

<!--
需求: 自定义2个指令
  1. 功能类型于v-text, 但转换为全大写
  2. 功能类型于v-text, 但转换为全小写
-->

<div id="test">
  <p v-upper-text="msg"></p>
  <p v-lower-text="msg"></p>
</div>

<div id="test2">
  <p v-upper-text="msg"></p>
  <p v-lower-text="msg"></p>
</div>

<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
  // 注册一个全局指令
  // el: 指令所在的标签对象
  // binding: 包含指令相关数据的容器对象
  Vue.directive('upper-text', function (el, binding) {
    console.log(el, binding)
    el.textContent = binding.value.toUpperCase()
  })
  new Vue({
    el: '#test',
    data: {
      msg: "I Like You"
    },
    // 注册局部指令
    directives: {
      'lower-text'(el, binding) {
        console.log(el, binding)
        el.textContent = binding.value.toLowerCase()
      }
    }

  })

  new Vue({
    el: '#test2',
    data: {
      msg: "I Like You Too"
    }
  })
</script>

 五:插件:


这个没搞懂,要时常复习。


六:结尾


继续加油。

 

以上是关于学习Vue第二天的主要内容,如果未能解决你的问题,请参考以下文章

vue学习第二天 ------ 临时笔记

重拾MVC——第二天:Vue学习与即时密码格式验证

vue第二天

vue.js总结第二天

学习Python第二天

4.14团队冲刺第二天