Vue.js(二)

vue 事件修饰符

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件修饰符</title>
    <style type="text/css">
        #div1 {
            height: 100px;
            background-color: red;
        }

        #div2 {
            height: 100px;
            background-color: green;
        }

        #div3 {
            height: 100px;
            background-color: brown;
        }
    </style>
</head>
<body>

<div id="app">
    <!--'.capture',启动事件的捕获模式,当内部的事件被触发,先执行外层的(相同)事件,在触发内部的(相同)事件-->
    <div @click.capture="divHandler" id="div1">

        <!--'.stop',阻止事件冒泡,即只执行当前这个元素的事件,不会触发外层的事件-->
        <!--<input type="button" value="点击" @click.stop="btnHandler" />-->

        <input type="button" value="点击" @click="btnHandler"/>

        <!--'.prevent',阻止事件的默认行为,即不执行元素原本的操作-->
        <a href="http://www.baidu.com" @click.prevent="linkClick">百度一下,你就知道</a>
    </div>

    <!--'.self',点击哪个元素就触发哪个元素上对应的事件,(里层元素)不会冒泡,也不会捕获-->
    <div id="div2" @click.self="divHandler">
        <input type="button" value="点击" @click="btnHandler"/>
    </div>

    <div id="div3" @click.self="divHandler">
        <!-- 注意:如果'.self'事件定义在内部元素中,则不会阻止冒泡行为 -->
        <!--'.once',无论事件被触发多少次,始终只会执行一次-->
        <input type="button" value="点击" @click.once="btnHandler">
    </div>
</div>


<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
<script type="text/javascript" charset="UTF-8">
    var vm = new Vue({
        el: '#app',
        data: {},
        methods: {
            btnHandler() {
                console.log("btn 点击事件");
            },
            divHandler() {
                console.log("div 点击事件")
            },
            linkClick() {
                alert("触发连接的点击事件");
            }
        }
    })
</script>
</body>
</html>

v-model 数据双向绑定

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-model 双向绑定</title>

    <style type="text/css">
        [v-cloak]{
            display: none !important;
        }
    </style>
</head>
<body>

<div id="app">

    <!--当修改input中msg的属性值,vm会同步修改data中对应的属性,然后渲染到页面上,实现数据双向绑定-->
    <!--注意:'v-model'只能运用在表单元素中-->
    <input type="text" v-model="msg" />

    <p v-cloak>{{msg}}</p>
</div>


<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
<script type="text/javascript" charset="UTF-8">
    var vm = new Vue({
        el: '#app',
        data: {
            msg: 'hello Vue!'
        },
        methods: {

        }
    })
</script>
</body>
</html>

案例:简易计算器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>练习:简易计算器</title>
</head>
<body>

<div id="app">
    <input type="text" v-model="n1"/>

    <select v-model="opt">
        <option value="+">+</option>
        <option value="-">-</option>
        <option value="*">*</option>
        <option value="/">/</option>
    </select>

    <input type="text" v-model="n2"/>
    <input type="button" value="=" @click="calc"/>
    <input type="text" v-model="result"/>
</div>

<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
<script type="text/javascript" charset="UTF-8">
    var vm = new Vue({
        el: '#app',
        data: {
            n1: 0,
            n2: 0,
            result: 0,
            opt: '+'
        },
        methods: {
            calc() {
                var opt = this.opt;
                var n1 = parseInt(this.n1);
                var n2 = parseInt(this.n2);

                switch (opt) {
                    case "+":
                        this.result = n1 + n2;
                        break;
                    case "-":
                        this.result = n1 - n2;
                        break;
                    case "*":
                        this.result = n1 * n2;
                        break;
                    case "/":
                        this.result = n1 / n2;
                        break;
                    default:
                        alert("无法计算!");
                        break;
                }
            }
        }
    })
</script>
</body>
</html>

vue通过属性绑定为元素设置class样式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>通过属性绑定元素设置class样式</title>

    <style type="text/css">
        [v-cloak]{
            display: none;
        }
        .red{
            color: red;
        }
        .thin{
            font-weight: 200;
        }
        .italic{
            font-style: italic;
        }
        .active{
            letter-spacing: 0.5em;
        }
    </style>
</head>
<body>

<div id="app">
    <!-- :class=['样式变量,xxx'],使用数组为标签绑定class类型的变量 -->
    <h1 v-cloak :class="['red','italic']">{{msg}}</h1>

    <!--:class绑定的样式中可以使用三目运算符-->
    <h1 v-cloak :class="['thin',flag?'active':'']">{{msg}}</h1>

    <!--:class绑定的样式中可以使用对象-->
    <h1 v-cloak :class="['red',{'italic':flag}]">{{msg}}</h1>

    <!--为标签的class属性绑定一个对象,注意:对象中的属性不需要使用''号-->
    <h1 v-cloak :class="classObj">{{msg}}</h1>
</div>

<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
<script type="text/javascript" charset="UTF-8">
    var vm=new Vue({
        el:'#app',
        data:{
            msg:'hello vue!',
            flag:true,
            classObj:{red:true,italic:true,thin:true}
        },
        methods:{

        }
    })
</script>
</body>
</html>

通过属性绑定为元素设置style行内样式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>通过属性绑定,为元素设置style样式</title>
</head>
<body>

<div id="app">
    <!--:style,使用对象为标签绑定css类型的属性-->
    <!--注意:对象的属性值为kv对象,如果k包含'-',那么该k必须使用''号-->
    <h1 :style="{color:'red','font-size':'48px'}">{{msg}}</h1>
    <h1 :style="styleObj1">{{msg}}</h1>

    <!--:style,使用数组为标签绑定多个css样式对象,如果多个对象中有相同的属性,那么后面的会覆盖前面的-->
    <h1 :style="[styleObj1,styleObj2]">{{msg}}</h1>
</div>

<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
<script type="text/javascript" charset="UTF-8">
    var vm = new Vue({
        el: '#app',
        data: {
            msg:'hello vue!',
            styleObj1:{color:'red','font-size':'48px'},
            styleObj2:{color:'green','font-style':'italic'}
        }
    })
</script>
</body>
</html>

v-for数据遍历

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue-for</title>
    <style>
        [v-cloak]{
            display: none;
        }
    </style>
</head>
<body>

<div id="app">
    <!--v-for,遍历数组-->
    <p v-cloak>{{list[0]}}</p>
    <!--注意:key表示数组中的元素,i是元素索引-->
    <p v-cloak v-for="(key,i) in list">{{key}},{{i}}</p>

    <!--遍历数组对象-->
    <p v-cloak v-for="(obj,i) in listObj">{{obj.username}}</p>

    <!--:key,使用 v-for循环的时候,或者在一些特殊情况中,如果v-for有问题,
   必须在使用v-for的同时,指定唯一的 字符串/数字 类型:key 值-->
    <!--注意:v-for循环的时候,key属性只能使用number/string类型的值-->
    <p v-cloak v-for="item in listObj" :key="item.id"></p>

    <!--遍历对象中的属性,注意这里的key是属性值,value是属性名,i是索引-->
    <p v-cloak v-for="(key,value,i) in obj">{{key}},{{value}},{{i}}</p>

    <!--遍历数字,从1开始-->
    <p v-cloak v-for="count in 10">{{count}}</p>
</div>


<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
<script type="text/javascript" charset="UTF-8">
    var vm = new Vue({
        el: '#app',
        data: {
            list:[1,2,3,4,5,6,7,8,9],
            listObj:[
                {id:1,username:'aa'},
                {id:2,username:'bb'},
                {id:3,username:'ee'},
                {id:4,username:'ff'},
                {id:5,username:'gg'}
            ],
            obj:{
                id:1,
                name:'张三',
                age:25,
                gender:'男'
            }
        }
    })
</script>
</body>
</html>

v-if,v-show控制元素内容显示/隐藏

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-if,v-show</title>
</head>
<body>

<div id="app">
    <!--如果元素涉及到频繁的切换,最好不要使用使用v-if-->
    <!--控制内容的显示/隐藏,如果表达式为false,则会删除整个标签元素;每次都会重新删除或创建元素-->
    <p v-if="flag">v-if</p>

    <!--控制内容的显示/隐藏,如果表达式为false,则会在标签中添加一个隐藏css样式;每次不会重新进行DOM的删除和创建操作-->
    <p v-show="flag">v-show</p>
</div>

<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
<script type="text/javascript" charset="UTF-8">
    var vm = new Vue({
        el: '#app',
        data: {
            flag:true
        }
    })
</script>
</body>
</html>

案例:品牌列表

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue 品牌列表案例</title>
    
    <!--bootstrap css核心文件-->
    <link rel="stylesheet" href="js/boostrap/css/bootstrap.min.css">

    <style type="text/css">
        [v-cloak]{
            display: none;
        }
    </style>
</head>
<body>

<div id="app">

    <div class="panel panel-primary">
        <div class="panel-heading">
            <h3 class="panel-title">添加品牌</h3>
        </div>
        <div class="panel-body form-inline">
            <label>
                Id:
                <input type="text" class="form-control" v-model="id">
            </label>

            <!--@keyup,绑定一个keyup事件,还可以指定监听哪个按键-->
            <label>
                name:
                <input type="text" class="form-control" v-model="name" @keyup.enter="add">
            </label>

            <button type="button" class="btn btn-primary" @click="add()">&nbsp;</button>

            <label>
                search:
                <input type="text" class="form-control" placeholder="name" v-model="keywords">
            </label>
        </div>
    </div>

    <table class="table table-bordered table-hover table-striped">
        <thead>
        <tr>
            <th>Id</th>
            <th>Name</th>
            <th>Ctime</th>
            <th>Operation</th>
        </tr>
        </thead>
        <tbody>
        <!--v-for,遍历的列表数据可以从一个方法中获取,该方法的参数可以访问vue实例中的数据-->
        <tr v-for="car in search(keywords)" :key="car.id">
            <td v-text="car.id"></td>
            <td v-text="car.name"></td>
            <td v-cloak>{{car.ctime | dataFormat('')}}</td>
            <td>
                <a href="" @click.prevent="del(car.id)">删除</a>
            </td>
        </tr>
        </tbody>
    </table>
</div>

<script type="text/javascript" src="js/vue.js" charset="UTF-8"></script>
<!--bootstrap js核心文件-->
<!--<script src="js/boostrap/js/bootstrap.min.js"></script>-->
<script type="text/javascript" charset="UTF-8">
    //定义全局过滤器,格式化时间
    Vue.filter('dataFormat',function (data,pattern) {
        //根据给定的时间字符串,得到一个特定的时间
        var dt=new Date(data);
        var y=dt.getFullYear();
        var m=dt.getMonth()+1;
        var d=dt.getDate();
        
        if (pattern.toLowerCase()==='yyyy-mm-dd'){
            return `${y}-${m}-${d}`;
        }else{
            var hh=dt.getHours();
            var mm=dt.getMinutes();
            var ss=dt.getSeconds();

            return `${y}-${m}-${d} ${hh}:${mm}:${ss}`;
        }
    });

    var vm = new Vue({
        el: '#app',
        data: {
            //因为做了数据双向绑定,所以这两个属性要在这里面定义
            id: '',
            name: '',
            keywords: '',
            list: [
                {id: 1, name: '奔驰', ctime: new Date()},
                {id: 2, name: '宝马', ctime: new Date()},
                {id: 3, name: '奥迪', ctime: new Date()},
                {id: 4, name: '兰博', ctime: new Date()},
                {id: 5, name: '福特', ctime: new Date()}
            ]
        },
        methods: {
            add() {
                //从data上获取id和name属性值,由于做了数据双向绑定,所以这也是用户输入的值
                var id = this.id;
                var name = this.name;
                var ctime = new Date();

                console.log(id);

                if (id == null || id == '') {
                    alert("Id输入框的值不能为空!!");
                    return false;
                }

                if (name == null || name == '') {
                    alert("Name输入框的值不能为空!!");
                    return false;
                }

                //组织出一个对象
                var car = {id: id, name: name, ctime: ctime};

                //将对象添加到data的list集合中
                this.list.push(car);

                //清空输入框的值
                this.id = this.name = '';
            },
            del(id) {
                //根据id找到list对应的对象,删除他
                this.list.some((item, i) => {
                    if (item.id == id) {
                        //删除list中对应的元素
                        this.list.splice(i, 1);

                        //终止循环
                        return true;
                    }
                })
            },
            search(keywords) {
                //filter()是数组中的一个方法,首先会遍历数组,然后执行过滤操作
                var newList=this.list.filter(item=>{
                    //includes()是es6的方法
                    if (item.name.includes(keywords)){
                       return item;
                    }
                });

                return newList;
            }
        }
    })
</script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值