vue 总结

VUE总结

双花括号{{}}

01.index.hmlt

 

main.js

 

内存的数据可以更改

 

v-model 双休数据绑定

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <!-- <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> -->
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <div>
        <input type="text" v-model="name">
        <span v-show="name">你的名字是:{{name}}</span>
    </div>
    <div>
        <input type="text" v-model="age">
        <span v-show="age">你的年龄是:{{age}}</span>
    </div>
    <div>
        <input type="text" v-model="sex">
        <span v-show="sex">你的年龄是:{{sex}}</span>
    </div>
</div>
</body>
<script src="js/main.js"></script>
</html>
01.index.html

 

var app = new Vue({
    el:"#app",
    data:{
        name:null,
        age:null,
        sex:null
    }
});
main.js

 

 

v-show:显示或者隐藏

main.js

index.html

 

语法

v-for:循环

main.js

 

index.html

 

运行结果

main.js 数据结构一般是嵌套的

index.html

 

每个对象的属性可以点出来

双花括号里的东西是可以进行运算的。

如计算打折后的价格。其中葱不打折

出现了NaN怎么解决呢???

三元运算符

判断是否有打折,有则显示打折后的价格,没有则显示原价格。

 

数据可以动态加

 

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-for</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <ul>
        <li v-for="food in foodList">{{food.name}}: ¥{{food.discount ? food.price * food.discount : food.price}}</li>
    </ul>
</div>
</body>
<script src="js/02.main.js"></script>
</html>
02.v-for.html

 

var app = new Vue({
    el:"#app",
    data:{
        // foodList:['姜','蒜','葱'],
        foodList:[
            {
                name:'姜',
                price:5,
                discount:.8,
            },
            {
                name:'蒜',
                price:9,
                discount:.5,
            },
            {
                name:'葱',
                price:2,
            }
        ],
    }
});
02.main.js

 

 

v-bind:绑定数据和元素属性  简写为':'冒号

默认跳转到百度,也可以动态修改跳转到淘宝页面。

 

绑定class名,方式1:

 

绑定class名,方式2:

 

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-bind</title>
    <script src="bli/vue.js"></script>
    <style>
        .active{
            background:#a10;
            color:#fff;
            text-decoration: none;
        }
    </style>
</head>
<body>
<div id="app">
    <!-- <a href="http://baidu.com">点我</a> -->
    <!-- <a v-bind:class="klass"  v-bind:href="url">点我</a> -->
    <a v-bind:class="{active: isActive}"  v-bind:href="url">点我</a>
</div>
</body>
<script src="js/03.main.js"></script>
</html>
03.v-bind.html

 

var app = new Vue({
    el:"#app",
    data:{
        url:"http://baidu.com",
        klass:'btn btn-default',
        isActive:true,
    }
});
03.main.js

 

 

v-on:绑定事件, 简写为'@'

给一个元素绑定1个事件:

 

给一个元素绑定多个事件:

注意:绑定的方法一定要有,否则会报错。

 

表单提交事件 

点击提交事件后(post/get请求),会自动刷新页面,控制台打印的东西就看不见了(闪了一下)。

 

阻止默认行为

方法1:e.preventDefault();   (必须传参)

提交事件后,不会自动刷新页面了。(e.preventDefault(); 阻止了默认行为)

 

方法2:.prevent   (不用传参)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <button v-on="{mouseenter: onEnter, mouseleave: onOut}" v-on:click="onClick">点我</button>
    <hr>
    <!-- 阻止默认行为方法1:传参 -->
    <!-- <form v-on:submit="onSubmit($event)">
        <input type="text">
        <button type="submit">提交</button>
    </form> -->
    <!-- 阻止默认行为方法2:不传参 -->
    <form v-on:submit.prevent="onSubmit">
        <input type="text">
        <button type="submit">提交</button>
    </form>
</div>
</body>
<script src="js/04.main.js"></script>
</html>
v-on阻止默认行为.html

 

var app = new Vue({
    el:"#app",
    methods:{
        onClick: function(){
            console.log('clicked');
        },
        onEnter: function(){
            console.log('mouse enter');
        },
        onOut: function(){
            console.log('mouse leave');
        },
        // 阻止默认行为方法2:不传参
        onSubmit: function(){
            console.log('submitted');
        },
        // 阻止默认行为方法1:传参
        // onSubmit: function(e){
        //     e.preventDefault();  // 阻止默认事件
        //     console.log('submitted');
        // },
    }
});
04.main.js

 

停止冒泡事件 .stop

 

键盘抬起事件 keyup

 

如果用户输入的是回车,应该怎么判断呢???

键盘按钮是回车键时  .enter

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-on</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <button v-on="{mouseenter: onEnter, mouseleave: onOut}" v-on:click="onClick">点我</button>
    <hr>
    <!-- 阻止默认行为方法1:传参 -->
    <!-- <form v-on:submit="onSubmit($event)">
        <input type="text">
        <button type="submit">提交</button>
    </form> -->
    <!-- 阻止默认行为方法2:不传参 -->
    <!-- <form v-on:submit.prevent="onSubmit">
        <input type="text">
        <button type="submit">提交</button>
    </form> -->

    <!-- 停止冒泡 -->
    <!-- <form v-on:submit.stop="onSubmit">
        <input type="text">
        <button type="submit">提交</button>
    </form> -->
    
    <!-- 键盘抬起事件 -->
    <!-- <form v-on:keyup="onKeyup" v-on:submit.stop="onSubmit">
        <input type="text">
        <button type="submit">提交</button>
    </form> -->

    <!-- 当键盘按的是回车键 -->
    <form v-on:keyup.enter="onEnter" v-on:submit.prevent="onSubmit">
        <input type="text">
        <button type="submit">提交</button>
    </form>

</div>
</body>
<script src="js/04.main.js"></script>
</html>
04.v-on.html

 

var app = new Vue({
    el:"#app",
    methods:{
        onClick: function(){
            console.log('clicked');
        },
        onEnter: function(){
            console.log('mouse enter');
        },
        onOut: function(){
            console.log('mouse leave');
        },
        // 阻止默认行为方法2:不传参
        onSubmit: function(){
            console.log('submitted');
        },
        // 阻止默认行为方法1:传参
        // onSubmit: function(e){
        //     e.preventDefault();  // 阻止默认事件
        //     console.log('submitted');
        // },

        // 键盘抬起事件
        // onKeyup:function(){
        //     console.log('Key up');
        // },
        
        // 按下的是回车键
        onEnter:function(){
            console.log('entered');
        },
    }
});
04.main.js

 

 

v-model 双向数据绑定

3个修饰符

.lazy 当失去焦点时,才会触发更新内容。

.trim 将前后空格都去掉。

普通的v-model,多个空格无效,最多只有1个空格。

 

如果想让它显示所有的空格怎么办呢???

 

用户输入的内容,前面有空格应该去掉。

聚焦时:前面的空格不显示。

 

失去焦点时:自动去掉前面的空格。

 

.number 输入的内容是数字类型。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-model</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <!-- <input type="text" v-model="name">
    <br>
    <pre>{{name}}</pre> -->

    <!-- 失去焦点,更新内容。 .lazy-->
    <!-- <input type="text" v-model.lazy="name">
    <br>
    {{name}} -->

    <!-- .trim 将前后空格都去掉 -->
    <!-- <input type="text" v-model.trim="name">
    <br>
    <pre>{{name}}</pre> -->

    <!-- .number 输入的内容是数字类型。  -->
    <input type="text" v-model.number="price">
    <br>
    <pre>{{price}}</pre>

</div>
</body>
<script src="js/05.main.js"></script>
</html>
05.v-model指令及修饰符.html

 

var app = new Vue({
    el:'#app',
    data:{
        name:"宝宝",
        price:10,
    }
});
05.main.js

 

 

v-model在其他元素及类型上的用法

单选框:

注意:name必须一样,才会单选。

 

单选框设置默认值:

注意:name属性可以不写。用v-model来代替。

 

多选框:

 

 

多选框设置默认值:

 

多行输入框:设置默认值

和input(text类型)是一样的效果。

 

下拉框:

默认显示第一个选项

下拉框:设置默认值为空

 

下拉框:设置默认值为指定value值(单选)

 

下拉框:设置默认值为指定value值(多选multiple)

注意:按住Ctrl键可以选中多个值。Shift可以连选选中多个值。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <!-- 单选框 -->
    <!-- <label>
        男
        <input name="sex" value="male" type="radio">
    </label>
    <label>
        女
        <input name="sex" value="female" type="radio">
    </label> -->
    
    <!-- 单选框设置默认值 -->
    <!-- <label>
        男
        <input v-model="sex" value="male" type="radio">
    </label>
    <label>
        女
        <input v-model="sex" value="female" type="radio">
    </label>
    <br>
    {{sex}} -->
    
    <!-- 多选框 -->
    <!-- <label>
        男
        <input v-model="sex" value="male" type="checkbox">
    </label>
    <label>
        女
        <input v-model="sex" value="female" type="checkbox">
    </label>
    <br>
    {{sex}} -->
    
    <!-- 多行输入框 -->
    <!-- <textarea v-model="texcon"></textarea>
    <br>
    {{texcon}} -->

    <!-- 下拉框 单选 -->
    <div>你来自哪里?</div>
    <select v-model="from">
        <option value="1">星球</option>
        <option value="2">火球</option>
    </select>
    <br>
    {{from}}

    <hr>

    <!-- 下拉框 多选-->
    <div>你要去哪里?</div>
    <select v-model="dest" multiple>
        <option value="1">星球</option>
        <option value="2">火球</option>
    </select>
    <br>
    {{dest}}


</div>
</body>
<script src="js/06.main.js"></script>
</html>
06.v-model在其他元素及类型上的用法.html

 

var app = new Vue({
    el:'#app',
    data:{
        // sex:'female', // 单选框默认值
        sex:['male','female'], // 多选框默认值
        texcon:'多行输入框默认值', // 多行输入框默认值
        // from:null, //下拉框设置默认值  null:空
        from:2, //下拉框设置默认值(单选)  value为2的选项
        dest:[], //下拉框设置默认值(多选)
    }
});
06.main.js

 

 

v-if 控制流指令

v-if / v-else

 

 

v-if / v-else-if / v-else

 

 

判断条件也可以的多个条件组成

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-if控制流指令</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <div v-if="role == 'admin' || role == 'vip'">
        管理员你好
    </div>
    <div v-else-if="role == 'hr'">
        hr你好
    </div>
    <div v-else>
        你没有权限访问次页面
    </div>
</div>
</body>
<script src="js/07.main.js"></script>
</html>
控制流指令.html

 

var app = new Vue({
    el:'#app',
    data:{
        // role:'admin', //管理员
        // role:'hr', 
        role:'vip',
    }
});
07.main.js

 

 

计算属性

1.将分数渲染出来

 

2.将分数放input中,可以改变值。

 

3.计算出总分

 

4.计算出平均分

 

5.将平均分四舍五入一下

 

以上的计算过程可以存到计算属性中,运行效果一样。

 

当删除一个值的时,会拼接字符串,而不是计算值,该怎么办呢???

 

方式1:将input宽加上数字类型即可计算。(推荐使用)

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>计算属性</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <table border="1">
        <thead>
            <th>学科</th>
            <th>分数</th>
        </thead>
        <tbody>
            <tr>
                <td>数学</td>
                <td><input type="text" v-model.number="math"></td>
            </tr>
            <tr>
                <td>物理</td>
                <td><input type="text" v-model.number="physics"></td>
            </tr>
            <tr>
                <td>英语</td>
                <td><input type="text" v-model.number="english"></td>
            </tr>
            <tr>
                <td>总分</td>
                <!-- <td>{{math + physics + english}}</td> -->
                <td>{{sum}}</td>
            </tr>
            <tr>
                <td>平均分</td>
                <!-- <td>{{Math.round((math + physics + english) / 3)}}</td> -->
                <td>{{average}}</td>
            </tr>
        </tbody>
    </table>
</div>
</body>
<script src="js/08.main.js"></script>
</html>
计算属性.html

 

var app = new Vue({
    el:'#app',
    data:{
        math:90,
        physics:80,
        english:30,
    },
    computed:{
        sum:function(){
            return this.math + this.physics + this.english;
        },
        average:function(){
            return Math.round(this.sum / 3)
        }
    }
});
08.main.js

 

方式2:parseFloat 强制转换为数字类型。

 

组件-全局及局部组件(作用域)

将一段常用的代码封装为一个组件。再调用这个组件。用的时候只需要写一对标签即可。可维护、可重复性高。 

 

两个作用域(#seg1、#seg2)虽然都写了按钮,但是只绑定一个作用域(#seg1)。所以只显示1个按钮。

 

 

全局组件 component

两个作用域都要绑定,按钮才会存活。

 

局部组件 components

 

当把全局钩子注释掉以后,会报错。因为#seg2里的组件找不到。局部组件是不能共用的!!!

将#seg2里的组件去掉,就不会报错了。

 

也可以把局部组件的相同代码都封装到一个变量中。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>全局及局部组件</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="seg1">
    <alert></alert>
</div>
<div id="seg2">
    <!-- <alert></alert> -->
</div>
</body>
<script src="js/09.main.js"></script>
</html>
全局及局部组件.html

 

// var app = new Vue({
//     el:"#app",
// });


// # 全局组件
/*Vue.component('alert',{
    template:'<button @click="on_click">弹弹弹</button>',
    methods:{
        on_click: function(){
            alert('Yo.');
        }
    }
});*/

var alert_component = {
    template:'<button @click="on_click">弹弹弹</button>',
    methods:{
        on_click: function(){
            alert('我是局部组件');
        }
    }
};

new Vue({
    el:"#seg1",
    // 局部组件
    components:{
        alert:alert_component
        // alert:{
            // template:'<button @click="on_click">弹弹弹</button>',
            // methods:{
            //     on_click: function(){
            //         alert('我是局部组件');
            //     }
            // }
        // }
    }
});

new Vue({
    el:"#seg2"
});
09.main.js

 

 

组件-配置组件

template: 组件内容

点赞数应该是动态的。专门放到一个变量中。

data是一个函数

 

methods:定义事件

哈哈!点赞不求人!

 

在点赞之前应该判断该用户是否点赞过了。

多次点击只能加一次!!!

 

如果用户点赞过了,那么再次点击就是取消点赞。

 

 

选中的时候绑定一个样式。

 

优化:

方案1:如果template代码太长了,也可以用ES6 的反引号。

 

方案2:也可以将代码放到html页面中。(因为template的代码就是标签。

只要传选择器就好了。

功能上没有任何区别。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>配置组件</title>
    <script src="bli/vue.js"></script>
    <style>
        .active{background:deeppink;}
    </style>
</head>
<body>
<div id="app">
    <like></like>
</div>

<template id="like-component-tpl">
    <button :class="{active:liked}" @click="toggle_like">
    赞{{like_count}}
    </button>
</template>

</body>
<script src="js/10.main.js"></script>
</html>
配置组件

 

// 全局组件
Vue.component('like',{
    // template:'<button :class="{active:liked}" @click="toggle_like">赞{{like_count}}</button>',
    
    // template:`
    //     <button :class="{active:liked}" @click="toggle_like">
    //         赞{{like_count}}
    //     </button>`,

    template:'#like-component-tpl',
    data:function(){
        return {
            like_count:10,
            liked:false,
        }
    },
    methods:{
        toggle_like:function(){
            if(!this.liked)  // 当前没有点赞就加加。
                this.like_count++;
            else  // 取消点赞
                this.like_count--;
            
            this.liked = !this.liked;
        }
    }
});

new Vue({
    el:"#app",
});
10.main.js

 

 

 

组件-组件通信之父子通信(从外部往组件内部传值)

之前在全局组件的时候,讲过一个例子,一个按钮弹出框。

 

那么问题来了,弹出的内容都是一样的,如何动态的弹出不同的值呢???

props 列表中变量才是有用的。

我们在标签中定义3个变量msg、a、b。但是我们只要msg的值。

 

props 列表中的变量才是有用的。(msg的值可以拿到,a、b的值都拿不到。)

 

props 列表中的没有的变量,是取不到值的,为undefined。

 

a标签的href链接是动态生成的。

 

如果有很多这样的a标签,就需要当该代表封装到组件中。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件-父子通信</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <!-- <alert msg="娃哈哈" a='1' b='2'></alert> -->
    <!-- <a href="/user/wahaha">wahaha</a> -->
    <user username="wahaha"></user>
</div>
</body>
<script src="js/11.main.js"></script>
</html>
组件-父子通信

 

// 全局组件
// Vue.component('alert',{
//     template:'<button @click="on_click">弹弹弹</button>',
//     props:['msg'],
//     methods:{
//         on_click:function(){
//             alert(this.a);
//         }
//     }
// });

// 全局组件
Vue.component('user',{
    template:`<a :href="'/user/'+ username">{{username}}</a>`,
    props:['username'],
    methods:{}
});

new Vue({
    el:"#app",
});
11.main.js

 

 

 

组件-组件通信之子父通信(通过事件的方式)

显示余额的父子组件

 

$emit是一个快捷方式,用于触发一个事件。在子元素show标签上去监听。

按钮是子组件,外头是父组件。子组件触发一个事件;父组件接收事件,同时修改父组件的值,然后div判断是否显示余额。

点击按钮显示余额。

 

也可以打印传过来的值。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件-子父通信</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <balance></balance>
</div>
</body>
<script src="js/12.main.js"></script>
</html>
组件-子父通信

 

// 父组件
Vue.component('balance',{
    template:`
        <div>
            <show @show-balance="show_div"></show>
            <div v-if="xsye">你的余额:¥98元</div>
        </div>
    `,
    data:function(){
        return {
            xsye:false, // 默认不显示余额
        }
    },
    methods:{
        show_div:function(data){
            this.xsye = true;  // 显示余额
            console.log(data);
        }
    },
});

// 子组件
Vue.component('show',{
    template:'<button @click="on_click">显示余额</button>',
    methods:{
        on_click(){
            this.$emit('show-balance',{a:1,b:2});
        }
    }
});

new Vue({el:"#app",});
12.main.js

 

 

组件-组件通信之任意及平行组件间通信(调度器

宝宝专门说,贝贝专门听。

注意:模板里面必须有个最外层的根元素。

 

默认显示:

输入值时:

如何将第一个组件输入的内容,显示在第二个组件中???i_said ---> baobao_said

调度器:任意组件间的通信。

 

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>组件-任意及平行组件间通信</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <baobao></baobao>
    <beibei></beibei>
</div>
</body>
<script src="js/13.main.js"></script>
</html>
13.组件-任意及平行组件间通信.html

 

// Event 调度器
var Event = new Vue();

Vue.component('baobao',{
    template:`
        <div>
            我说: <input @keyup="on_change" v-model='i_said'/> {{i_said}}
        </div>`,
    data:function(){
        return {
            i_said:'',
        }
    },
    methods:{
        on_change:function(){
            Event.$emit('baobao-said-something', this.i_said);
        }
    },
});

Vue.component('beibei',{
    template:`<div>宝宝说:{{baobao_said}}</div>`,
    data:function(){
        return {
            baobao_said:'',
        };
    },
    //  mounted:挂载完毕。
    mounted:function(){
        // 在触发器调用之前,将this缓存成一个变量。
        var me = this;
        Event.$on('baobao-said-something', function(data){
            console.log(data);
            me.baobao_said = data;
        });
    }
});

new Vue({
    el:'#app',
});
13.main.js

 

过滤器(格式化)

1.价格后面加上符号‘元’。

 

2.价格后面的单位也要动态的传值。(如:元、¥、$)

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>过滤器</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="text" v-model="price">
    <!-- {{ price | currency }} -->
    {{ price | currency('美元') }}
</div>
</body>
<script src="js/14.main.js"></script>
</html>
14.过滤器.html

 

// 过滤器
Vue.filter('currency',function(data,unit){
    data = data || 0;  // data有值就等于data,没值就为0.
    unit = unit || '元';  // unit有值就等于unit,没值就为'元'.
    return data + unit;
    // return data + '元';
});

new Vue({
    el:'#app',
    data:{
        price:10,
    },
});
14.main.js

 

3.毫米与米的转换。

 

4.毫米与米的转换,保留两位小数。

 

 

自定义指令-基础配置

1.自定义指令

 

2.给只为true的元素定位(固定定位)

 

3.加一个按钮,切换是否定位。

默认都是没有定住的。点击之后定住,再点击之后就是取消定住。

默认、取消定住

定住

4.可以给很多按钮就加上。

默认、取消定位

定位

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>15.自定义指令-基础配置</title>
    <script src="bli/vue.js"></script>
    <style>
        .card{
            width:200px;
            background:#ccc;
            padding:10px;
            margin:5px;
        }
    </style>
</head>
<body>
<div id="app">
    <div v-pin="card1.pinned" class="card">
        <button @click="card1.pinned = !card1.pinned">定住/取消</button>
        我就是我,不一样的烟火。
    </div>
    <div v-pin="card2.pinned" class="card">
        <a @click="card2.pinned = !card2.pinned" href="#">pin it</a>
        好好学习,天天向上。
    </div>
    <h1>头部</h1>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <h1>中部</h1>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <h1>底部</h1>
</div>
</body>
<script src="js/15.main.js"></script>
</html>
15.自定义指令-基础配置.html

 

// 自定义指令
Vue.directive('pin',function(el,binding){
    // var $el = $(el); // 绑定的元素
    var data = binding.value
    // console.log(data); // true/false
    if(data){ // 定住
        el.style.position = 'fixed';
        el.style.top = '10px';
        el.style.left = '10px';
    }else{  // 取消定住
        el.style.position = 'static';
    }
});

new Vue({
    el:'#app',
    data:{
        card1:{
            pinned:false,
        },
        card2:{
            pinned:false,
        }
    },
});
15.main.js

 

自定义指令-配置传参及修饰符

以上例子只能定位到左上角,不够灵活。位置应该动态传参。

1.定位到右下角:

打印 var position = binding.modifiers;

console.log('position',position)  // position {bottom: true, right: true}

运行结果:已定位到右下角

2.定位到左下角,只要改一个值即可。

 

3.让一些卡片样式有所不同,突出。

获取该值(:true),设置样式。

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>16.自定义指令-配置传参及修饰符</title>
    <script src="bli/vue.js"></script>
    <style>
        .card{
            width:200px;
            background:#ccc;
            padding:10px;
            margin:5px;
        }
    </style>
</head>
<body>
<div id="app">
    <div v-pin:true.bottom.left="card1.pinned" class="card">
        <button @click="card1.pinned = !card1.pinned">定住/取消</button>
        我就是我,不一样的烟火。
    </div>
    <div v-pin="card2.pinned" class="card">
        <a @click="card2.pinned = !card2.pinned" href="#">pin it</a>
        好好学习,天天向上。
    </div>
    <h1>头部</h1>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <h1>中部</h1>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <hr>
    <h1>底部</h1>
</div>
</body>
<script src="js/16.main.js"></script>
</html>
16.自定义指令-配置传参及修饰符.html

 

// 自定义指令
Vue.directive('pin',function(el,binding){
    // var $el = $(el); // 绑定的元素
    var data = binding.value
    // console.log(data); // true/false

    var position = binding.modifiers;
    // console.log('position',position) // position {bottom: true, right: true}

    var warning = binding.arg;
    // console.log('warning',warning)  // warning true    warning undefined

    if(data){ // 定住
        el.style.position = 'fixed';

        for (var i in position){
            if (position[i]){
                el.style[i] = '10px';
            }
        };

        if (warning === 'true'){
            el.style.background = 'yellow';
        }
        
        // el.style.top = '10px';
        // el.style.left = '10px';    
    }else{  // 取消定住
        el.style.position = 'static';
    }
});

new Vue({
    el:'#app',
    data:{
        card1:{
            pinned:false,
        },
        card2:{
            pinned:false,
        }
    },
});
16.main.js

 

 

混合 mixins

1.点击切换显示隐藏。

默认不显示div.

点击后显示div,再次点击有隐藏div.

代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>17.混合 mixins</title>
    <script src="bli/vue.js"></script>
</head>
<body>
<div id="app">
    <popup></popup>
</div>
</body>
<script src="js/17.main.js"></script>
</html>
index.html

 

// 弹出层组件
Vue.component('popup',{
    template:`
        <div>
            <button @click="toggle">Popup显示</button>
            <div v-if="visible">
                <h4>title</h4>
                好好学习,天天向上!
            </div>
        </div>
    `,
    data:function(){
        return {
            visible:false, // div默认不可见。
        }
    },
    methods:{
        toggle:function(){
            this.visible = !this.visible;
        }
    },
});


new Vue({
    el:"#app",
    data:{},
});
17.main.js

 

2.鼠标移入、移出切换显示隐藏。

默认、移出

移入:

代码:

// 提示框组件  (鼠标移入移出显示、隐藏)
Vue.component('tooltip',{
    template:`
        <div>
            <span @mouseenter="show" @mouseleave="hide">bys</span>
            <div v-if="visible">月亮代表我的心。</div>
        </div>
    `,
    data:function(){
        return {
            visible:false,
        }
    },
    methods:{
        show:function(){
            this.visible = true;
        },
        hide:function(){
            this.visible = false;
        },
    },
});


// 弹出层组件 (点击切换显示、隐藏)
Vue.component('popup',{
    template:`
        <div>
            <button @click="toggle">Popup显示</button>
            <div v-if="visible">    
                <span @click="hide">X</span>
                <h4>title</h4>
                好好学习,天天向上!
            </div>
        </div>
    `,
    data:function(){
        return {
            visible:false, // div默认不可见。
        }
    },
    methods:{
        toggle:function(){
            this.visible = !this.visible;
        },
        hide:function(){
            this.visible = false;
        },
    },
});


new Vue({
    el:"#app",
    data:{},
});
17.main.js

 

 

3.点击显示的div应该有个可以关闭的按钮。

注意:这两个组件有好多重复的代码!

点击后隐藏div

 

混合 mixins(相同的代表放在一起)

功能是一样的。注意:自己写的会覆盖mixins的。

代码:

// 混合 mixins (将相同的代码放一起)
var base = {
    data:function(){
        return {
            visible:false,
        }
    },
    methods:{
        show:function(){
            this.visible = true;
        },
        hide:function(){
            this.visible = false;
        },
        toggle:function(){
            this.visible = !this.visible;
        },
    },
}


// 提示框组件  (鼠标移入移出显示、隐藏)
Vue.component('tooltip',{
    template:`
        <div>
            <span @mouseenter="show" @mouseleave="hide">bys</span>
            <div v-if="visible">月亮代表我的心。</div>
        </div>
    `,
    mixins:[base],
});


// 弹出层组件 (点击切换显示、隐藏)
Vue.component('popup',{
    template:`
        <div>
            <button @click="toggle">Popup显示</button>
            <div v-if="visible">    
                <span @click="hide">X</span>
                <h4>title</h4>
                好好学习,天天向上!
            </div>
        </div>
    `,
    mixins:[base],
    data:function(){
        return {
            visible:true, // 自己写的会覆盖mixins的。
        }
    },
});

new Vue({
    el:"#app",
    data:{},
});
17.main.js

 

 

插槽 slots

1.定义一个样式

 

2.内容都是相同的。动态传参(插槽)

 

3.如果头部、底部都要动态传参呢???定义name!!!

 

4.指定默认值。

 代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>插槽 slots</title>
    <script src="bli/vue.js"></script>
    <style>
        .panel{
            max-width:300px;
            border:1px solid #999;
            margin-bottom:15px;
        }
        .panel > *{
            padding:15px;
        }
        .panel .title{
            border-bottom:1px solid #999;
        }
        .panel .footer{
            border-top:1px solid #999;
        }
    </style>
</head>
<body>
<div id="app">
    <panel>
        <div slot="title">aaa</div>
        <div slot="content">bbb</div>
        <!-- <div slot="footer">ccc</div> -->
    </panel>
</div>
<template id="panel-tpl">
    <div class="panel">
        <div class="title">
            <slot name="title"></slot>
        </div>
        <div class="content">
            <slot name="content"></slot>
        </div>
        <div class="footer">
            <slot name="footer">更多信息</slot>
        </div>
    </div>
</template>
</body>

<script src="js/18.main.js"></script>
</html>
18.插槽 slots.html

 

Vue.component('panel',{
    template:"#panel-tpl",
});


new Vue({
    el:'#app',
    data:{}
});
18.main.js

 

 
 
posted @ 2018-07-02 15:43  虫洞小鳗鱼  阅读(209)  评论(0编辑  收藏  举报