Vue学习第一天

代码以及备注:
代码一:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="lib/vue.min.js"></script>
    <style>
        [v-cloak] {
            display: none;
        }
    </style>
</head>
<body>
    <!-- 
        1、v-html是把数据按照html对象进行解析
        2、v-cloak、v-text是解决页面在加载时出现的页面闪烁问题
        3、v-text会覆盖原有的文字,v-cloak不会
        4、默认使用v-text时没有闪烁问题
        5、v-bind是提供属性绑定的一个指令
        6、v-bind中可以把属性当作一个变量
        7、v-bind:指令可以被简写为   :要绑定的属性
        8、v-bind中可以写合法的JS表达式
        9、Vue中提供了 v-on:事件绑定机制
        10、v-on:的简写是   @
        11、在VM实例中如果想要获取data中的数据,
            或者想要调用methods中的方法,必须通过this.属性名 或 this.方法名 来进行访问,
            这里的this就表示我们new出来的VM实例对象
        12、VM实例,会监听自己身上 data 中所有数据的改变,
            只要数据一发生变化,就会把最新的数据,从data身上同步到页面中去
     -->
    <div id="test">
        <!-- <p v-cloak>{{ msg }}</p>
        <div v-html="msg2"></div> -->
        <input type="button" value="浪一下" :title="msg" @click=show>
        <input type="button" value="低调" :title="str2" @click=stop>
        <p>{{ str }}</p>
    </div>
    <script>
        var vm = new Vue({
            el: '#test',
            data:{
                msg: "hello",
                str: "猥琐发育,别浪",
                str2: "低调",
                msg2:"<h1>Hello World</h1>",
                intervalId: null //在data上定义一个定时器ID
            },
            methods:{
                show() {
                    if(this.intervalId != null)return;
                    this.intervalId = setInterval( () => {
                        var begin = this.str.substring(0,1);
                        var end = this.str.substring(1);
                        this.str = end + begin;
                    },300);
                },
                stop(){
                    clearInterval(this.intervalId);
                    this.intervalId = null;
                    this.str = "猥琐发育,别浪";
                }
            }
        })
    </script>
</body>
</html>

代码二:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="lib/vue.min.js"></script>
    <style>
        .inner {
            height: 150px;
            background-color: pink;
        }
        .outer {
            padding: 40px;
            background-color: red;
        }
    </style>
</head>
<!-- 
    1、.stop阻止向父级冒泡事件,例:@click.stop=函数名
    2、.prevent阻止默认行为
    3、使用 .capture 实现捕获触发事件的机制
    4、使用 .self 实现只有点击当前元素时候,才会触发事件处理函数
    5、使用 .once 只触发一次事件处理函数
 -->
<body>
    <div id="app">
        <!-- 1、.stop阻止向父级冒泡事件,例:@click.stop=函数名 -->
        <div class="inner" @click="divHandler">
            <input type="button" value="戳他" @click.stop="btnHandler">
        </div>

        <!-- 2、.prevent阻止默认行为 -->
        <a href="http://www.baidu.com" @click.prevent="linkClick">有问题,先百度</a>
    
        <!-- 3、使用 .capture 实现捕获触发事件的机制 -->
        <div class="inner" @click.capture="divHandler">
            <input type="button" value="戳他" @click="btnHandler">
        </div>

        <!-- 4、使用 .self 实现只有点击当前元素时候,才会触发事件处理函数 -->
        <div class="inner" @click.self="divHandler">
            <input type="button" value="戳他" @click="btnHandler">
        </div>

        <!-- 5、使用 .once 只触发一次事件处理函数 -->
        <a href="http://www.baidu.com" @click.once.prevent="linkClick">有问题,先百度</a>

        <p>-----------------------------------------------------------------------------------------</p>
        
        <!-- 演示:.self和 .stop的区别 
             self:被让我被别人冒泡,stop:别让其他人冒泡
             self:自身不响应事件,且不影响事件的传递,
             stop:自身响应事件,但阻止事件的传递

             self:是只有是自己触发的,自己才会执行,如果接受到内部的冒泡事件传递信号触发,会忽略掉这个信号,。
             stop:是阻止冒泡行为,不让当前元素的事件继续往外触发,如阻止点击div内部事件,触发div事件
        -->
        
        <div class="outer" @click="divHandler2">
            <div class="inner" @click.self="divHandler">
                <input type="button" value="戳他" @click="btnHandler">
            </div>
        </div>
    </div>
    <script>
        //创建Vue()实例,得到ViewModel
        var vm = new Vue({
            el: "#app",
            data: {
                
            },
            methods: {
                divHandler(){
                    console.log('这是触发了 inner div 的点击事件');
                },
                btnHandler(){
                    console.log('这是触发了 button 的点击事件');
                },
                linkClick(){
                    console.log('这是出发了链接点击事件');
                },
                divHandler2(){
                    console.log('这是触发了 outer div 的点击事件');
                }
            }
        })
    </script>
</body>
</html>

代码三:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="lib/vue.min.js"></script>
</head>
<body>
    <div id="app">
        <h4>{{ msg }}</h4>

        <!-- v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V ,无法实现数据的双向绑定 -->
        <input type="text" :value="msg" style="width: 100%;">
        
        <!-- 使用 v-model 指令,可以实现表单元素和Model中的数据双向绑定 -->
        <!-- v-model 只能运用在表单元素中 -->
        <!-- input(radio、text、address、email...) select  checkbox   textarea  -->
        <input type="text" v-model="msg" style="width: 100%;">
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                msg: "hello,大家好啊"
            },
            methods: {
                
            },
        })
    </script>
</body>
</html>

代码四:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>简易计算器</title>
    <script src="lib/vue.min.js"></script>
</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="count">
        <input type="text" v-model="result">
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                n1: 0,
                n2: 0,
                result: 0,
                opt: "+"
            },
            methods: {
                count(){
                    // if(this.n1 != null && this.n2 != null){
                    //     if(opt == "+"){
                    //         this.result = n1 + n2
                    //     }else if(opt == "-"){
                    //         this.result = n1 - n2
                    //     }else if(opt == "*"){
                    //         this.result = n1 * n2
                    //     }else{
                    //         this.result = n1 / n2
                    //     }
                    // }

                    // if(this.n1 != null && this.n2 != null){
                    //     switch (this.opt) {
                    //         case "+":
                    //             this.result = parseInt(this.n1) + parseInt(this.n1);
                    //             break;
                    //         case "-":
                    //             this.result = parseInt(this.n1) - parseInt(this.n2);
                    //             break;
                    //         case "-":
                    //             this.result = parseInt(this.n1) * parseInt(this.n2);
                    //             break;
                    //         default:
                    //             this.result = parseInt(this.n1) / parseInt(this.n2);
                    //             break;
                    //     }
                    // }

                    // 这属于投机取巧的方式,正式开发中尽量少用,若用户上传了恶意代码的字符串,这个函数就会解析,造成安全隐患
                    var str = "parseInt(this.n1) "+ this.opt +"parseInt(this.n2)"
                    this.result = eval(str);
                }
            },
        })
    </script>
</body>
</html>

代码五:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Class</title>
    <script src="lib/vue.min.js"></script>
    <style>
        .red {
            color: red;
        }
        .thin {
            font-weight: 200;
        }
        .italic {
            font-style: italic;
        }
        .active {
            letter-spacing: 0.5em;
        }
    </style>
</head>
<body>
    <div id="app">
        <!-- 第一种使用方式,直接传递一个数组,
            注意:这里的class需要使用 v-bind 做数据绑定
            类名必须用单引号括起来 
            数组中可以用三元表达式
        -->
        <h1 :class="['red', 'thin', 'italic', flag?'active':'']">这是一个很大的H1</h1>
        
        <!-- 但是写三元表达式比较麻烦,因此也可以使用对象形式代替三元表达式,提高代码可读性 -->
        <h1 :class="['red', 'thin', 'italic', {'active':flag}]">这是一个很大的H1</h1>

        <!-- 在为 class 使用v-bind对象的时候,
            对象的属性是类名,对象的属性可带引号,也可不带引号
            属性的值是一个标识符
         -->
        <h1 :class="classObj">这是一个很大的H1</h1>


    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                flag: true,
                classObj: {red:true, thin:true, active:false, italic:true}
            },
            methods: {
                
            },
        })
    </script>
</body>
</html>

代码六:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>样式</title>
    <script src="lib/vue.min.js"></script>
</head>
<body>
    <div id="app">
        <!-- 属性里包含横线必须给属性加个单引号 -->
        <h1 :style="styleObj1">这是一个h1</h1>
        <h1 :style="[styleObj1, styleObj2]">这是一个h1</h1>

    </div>

    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                styleObj1: { color: 'red', 'font-weight': 200},
                styleObj2: { 'font-style': 'italic' }
            }
        })
    </script>
</body>
</html>

代码七:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>v-for</title>
    <script src="lib/vue.min.js"></script>
</head>

<!-- v-for循环可以遍历普通数组,遍历对象数组,遍历对象中的值,迭代数字 -->
<body>
    <div id="app">
        <p v-for="(item,i) in list">索引值:{{i}}-------{{ item }}</p>
        <p v-for="(user,i) in user1">{{ user.id }}--{{ user.name }}----索引值:{{ i }}</p>
        
        <!-- 注意:在遍历对象身上的键值对的时候,除了由val key之外,在第三个位置还有一个索引 -->
        <p v-for="(val,key,i) in user2">键是:{{ key }},值是{{ val }}----索引值:{{ i }}</p>

        <!-- in 后面可以放普通数组、对象数组、对象、数字 -->
        <!-- 用v-for来迭代一个数字的话,起始不是0,是1  -->
        <p v-for="count in 10">这是第 {{ count }} 次循环</p>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                list: [1,2,3,4,5,6],
                user1: [
                    {id: 1, name:"a"},
                    {id: 2, name:"b"},
                    {id: 3, name:"c"},
                    {id: 4, name:"d"}
                ],
                user2: {
                    id: 1,
                    name: '123',
                    gender: '女'
                }
            },
            methods: {
                
            },
        });
        [].forEach((item,i) => {})
    </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值