zoukankan      html  css  js  c++  java
  • 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
     
     
  • 相关阅读:
    matlab矩阵中如何去掉重复的行;如何找到相同的行,并找到其位置
    Coursera 机器学习 第9章(下) Recommender Systems 学习笔记
    机器学习基石笔记1——在何时可以使用机器学习(1)
    Coursera 机器学习 第9章(上) Anomaly Detection 学习笔记
    matlab安装过程的被要求的配置程序
    jdk环境变量配置
    Coursera 机器学习 第8章(下) Dimensionality Reduction 学习笔记
    Coursera 机器学习 第8章(上) Unsupervised Learning 学习笔记
    Coursera 机器学习 第7章 Support Vector Machines 学习笔记
    linux服务器---squid限制
  • 原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/9254128.html
Copyright © 2011-2022 走看看