vue : 生命周期钩子 +自定义过滤器 +自定义指令

生命周运算期钩子

  • 所有的生命周期钩子自动绑定 this 上下文中的实例
    • 访问数据
    • 对属性和方法进行
    • 不能使用es6中的箭头函数来定义生命周期函数

生命周期钩子函数

生命周期钩子函数视图.png
  1. 初始之前 / 初始之后
  • beforeCreate
  • created
  1. 挂载之前 / 挂载之后
  • beforeMount
  • mounted
  1. 更新之前 / 更新之后
  • beforeUpdate
  • updated
  1. 销毁之前 / 销毁之后
  • beforeDestroy
  • destroyed
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>声明周期钩子</title>
    <link rel="stylesheet" href="bootstrap.css">
</head>
<body> 
    <div id="app">
        <div>
            <button 
                @click="change"
                type="button" 
                class="btn btn-info btn-lg"
            >
                点击更新
            </button>
            <h1>{{msg}}</h1>
        </div>
    </div>
    <script src="vue.js"></script>
    <script>
        let vm = new Vue({
            el: '#app',
            data:{
                msg: 'Hello World !'
            },
            methods: {
                change(){
                    this.msg = '数据更新';
                }
            },
            beforeCreate(){
                alert('初始之前');
            },
            created(){
                alert('初始之后');
            },
            beforeMount(){
                alert('挂载之前');
            },
            mounted(){
                alert('挂载之后');
            },
            beforeUpdate(){
                alert('更新之前');
            },
            updated(){
                alert('更新之后');
            },
            beforeDestroy(){
                alert('销毁之前');
            },
            destroyed(){
                alert('销毁之后');
            }
        });
        
        // 在以上三个状态正确调用后使用
        // vm.$destroy();
        
    </script>
</body>
</html>

下面为代码执行的状态

  1. 初始之前


    初始之前.png
  2. 初始之后


    初始之后.png
  3. 挂载之前


    挂载之前.png
  4. 挂载之后,点击确定后正常显示页面


    挂载之后.png

    挂载之后点击确定,正常显示页面.png
  5. 更新之前


    点击跟新按钮之后-更新之前.png
  6. 更新之后,点击确定后页面更新


    更新之后.png

    确定数据更新之后.png
  7. 销毁之前


    销毁之前.png
  8. 销毁之后


    销毁之后.png

自定义过滤器

  • vue1 自带过滤器
  • vue2 可以自己定义,设置需要的过滤器
  • 简介:自定义过滤器就类似于自定义指令,可以用全局的Vue.filter() 注册一个自定义过滤器
  • 参数
    • ID
    • 函数
    • 函数的参数为值,返回转换后的值
    • 可以为任意数量的值

demo

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义过滤器</title>
    <link rel="stylesheet" href="bootstrap.css">
    <style>
        [v-cloak]{
            display: none;
        }
    </style>
</head>
<body>
    <div id="app" v-cloak>
        <div class="container" style="padding: 50px 0;">
            <ul class="list-group h3">
                <li v-for="(item,i) in lists" :class="{active:index===i}" class="list-group-item">{{item | suffix}}</li>
            </ul>
        </div>
    </div>
    <script src="vue.js"></script>
    <script>
        Vue.filter('suffix',val=>(`¥${val}.00 元`));
        let vm = new Vue({
            el: "#app",
            data:{
                lists: [100,200,300,400,500],
                index: 0
            }
        })
    </script>
</body>
</html>

浏览器渲染结果:


自定义过滤器.png
自定义过滤器就相当于自定了一个模板,优化代码,提高代码的重用性

自定义指令

  • 简而言之就是自己向Vue添加自己定义的指令
    • 通过v-XXX 确定指令名称
    • 通过Vue.directive('XXX',function(){}) 一个参数注册指令名称,第二个参数注册行为

demo 1

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定义指令-drag</title>
    <style>
        span{
            position: absolute;
            display: inline-block;
            top: 100px;
            left: 100px;
            margin: 20px;
            width: 100px;
            height: 100px;
            background: red;
        }
    </style>
</head>
<body>
    <div id="app">
        <span class="drag" v-drag></span>
    </div>
    <script src="vue.js"></script>
    <script>
        Vue.directive('drag',el=>{
            console.log(el);
            el.onmousedown = e=>{
                let disX = e.clientX - el.offsetLeft;
                let disY = e.clientY - el.offsetTop;
                document.onmousemove = e=>{
                    el.style.left = e.clientX - disX + 'px';
                    el.style.top = e.clientY - disY + 'px';
                };
                document.onmouseup = e=>{
                    document.onmousemove = null;
                    document.onmouseup = null;
                }
            }
        })
        let vm = new Vue({
            el: "#app"
        })
    </script>
</body>
</html>

页面渲染结果:

自定义指令-drag.png
  • READEME:根据上面的demo
    • v-drag : 自定义指令名称
    • Vue.directive("drag",el=>{}) : 注册指令和指令对应的行为
      • Vue.directive("drag",function(){console.log(arguments)}) ,通过arguments了解具体的参数(上demo)
        • 第一个参数:设置指令的元素
        • arguments的打印结果
arguments打印结果.png

demo 2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <h1 v-border="blue">sdljlsjd</h1>
    </div>
    <script src="vue.js"></script>
    <script>
        Vue.directive('border',function($1,$2){
            console.log(arguments);
            $1.style.border = `dashed 2px ${$2.value}`;
        })
        let vm = new Vue({
            el: '#app',
            data: {
                blue: 'red'
            }
        })
    </script>
</body>
</html>

页面渲染结果:


自定义指令.png
  • READEME:根据上面的demo
    • 在 页面标签中自定义指令,demo中的自定义指令为 v-border
    • 自定义指令的值自定义的值,demo中的自定义值为 blue,对应vue实例中对象名 blue
    • vue实例中自定义属性名的值为自定义属性值, demo中的自定义属性值为 red
    • 实现自定义的指令通过 Vue.directive() 实现
      • 参数
        • 第一个参数:ID ,自定义指令 v- 后面的值
        • 第二个参数:函数
          • 函数有5个值 (所用到的)
            • 第一个参数:定义指令的元素
            • 第二个参数:Object对象,可以获取到我们设置的ID名:border,指令名:v-border,属性值:red,属性名:blue

自定义动画

  • 简单说就是 让谁动,就把谁用<transition></transition>包裹起来
  • 一组动画就用<transition-group></transition-group>包裹起来,当然,transition-group中的每一个动画单独提都需要一个独一无二的key值
  • 动画部分,根据name值,按照css3的动画去编写 ,动画 可到animate.css官网学些:https://daneden.github.io/animate.css/
    • name值的四个状态:name="move"
      • move-enter:在进入动画之前
      • move-enter-active:在进入动画之后
      • move-leave:在离开动画之前
      • move-leave:在离开动画之后
<transition name="move">
  <div></div>
</transition>
<transition-group name="move">
  <div v-for="(item,i)" key="item._id">
    <span></span>
    <p></p>
  </div>
 </transition-group>
  • 自定义动画配合animate.css (不需要name
<transition 
  enter-active-class="animated fadeInUp" 
  leave-active-class="animated fadeOutDown
>
  <div></div>
<transition>
<transition-group 
  enter-active-class="animated fadeInLeft"
  leave-active-class="animated fadeInRight"
>
  <div key="1"></div>
  <div key="2"></div>
</transition-group>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345