Vue(1)

2018-10-15  本文已影响0人  一颗脑袋

什么是Vue.js?

学习框架的好处

能显著地提高开发效率。

MVC和MVCC的关系

使用Vue.js输出hello

Vue.js的安装十分简单,我们只需要引入外部js文件即可。我们直接看代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
<title>Hello Vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
  <div id="app">
    <p>这是我要说的:{{msg}}</p>
  </div>
</body>
  <script type="text/javascript">
    var vm = new Vue({
      el: "#app",
      data: {
        msg: "hello Vue."
      }
    });
  </script>
</html>

这是最基本的Vue.js的使用,Vue.js为我们提供了Vue这个对象,我们可以进行实例化,而参数el为elemnt的缩写,表示Vue实例绑定的页面元素,而data中我们可以存放一些我们需要使用的数据。
结合MVVM架构,我们可以发现Vue对象的实例vm即VM层,实现了数据的双向绑定,V层即id为app的<div>,M层即vm中的data对象,存储着页面需要使用到的数据。

v-指令

[v-cloak] {
    display: none;
}

这样,页面就不会因为先加载后编译出现的闪烁效果。

<span v-text="message"></span> //等价于下面的语句
<span>{{message}}</span>
//假设message = "<h1>Hello</h1>";
<div v-text="message"></div> //div中显示:<h1>Hello</h1>
<div v-html="message"></div> //div中显示:Hello,和Hello被<h1>标签包裹。
<div v-bind:title="message+'其他内容'"></div>//可以使用message变量+表达式的形式赋值给属性title。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <!--方法处理器-->
        <button v-on:click="show">方法处理器</button><br/>
        <!--内联语句-->
        <button v-on:click="change('message is changed')">内联语句</button><br/>
        <!--  串联修饰符 -->
        <button @click.stop.prevent="show">串联修饰符</button><br/>
        <!-- 键修饰符,键别名 -->
        <input @keyup.enter="onEnter"><br/>
        <!-- 键修饰符,键代码 -->
        <input @keyup.13="onEnter"><br/>
        <!-- 点击回调只会触发一次 -->
        <button v-on:click.once="show">只会触发一次</button><br/>
        <!-- 对象语法 (2.4.0+):不能执行内联语句 -->
        <button v-on="{ click: change, mouseleave: show }">对象语法</button><br/>
        <!--绑定多事件-->
        <button @click="change('hello')" @mouseleave="show">多事件</button>
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                message: "This is a message."
            },
            methods: {
                show: function(){
                    alert(this.message);
                },
                change: function(text){
                    this.message = text;
                },
                onEnter: function(){
                    alert("onEnter is run");
                }
            }
        });
    </script>
</body>
</html>

练习:跑马灯效果

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <button @click="run">浪起来</button>
        <button @click="stop">低调</button>
        <div>{{message}}</div>
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                message: "猥琐发育!别浪~~~",
                interval: null
            },
            methods: {
                run: function(){
                    if(!this.interval){
                        var _this = this;//这里可以使用箭头函数解决this指向问题
                        this.interval = window.setInterval(function(){
                            var arrStr = _this.message.split("");
                            var str = arrStr.shift();
                            arrStr.push(str);
                            _this.message = arrStr.join("");
                        },400);
                    }
                },
                stop(){
                    window.clearInterval(this.interval);//这里interval会赋值为数字
                    this.interval =  null;
                }
            }
        });
    </script>
</body>
</html>

v-model实现表单元素的双向数据绑定

目前Vue.js只有v-model才是真正地数据双向绑定,即在页面修改数据同样能动态改变数据的值。
比如:

<html>
<head>
    <meta charset="utf-8">
    <title>Test</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <!--使用v-bind动态显示message-->
        <input type="text" v-bind:value="message1">
        <span>{{message1}}</span>
        <br/>
        <!--使用v-model进行表单数据绑定-->
        <input type="text" v-model="message2">
        <span>{{message2}}</span>
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                message1: "this is message1!",
                message2: "this is message2!"
            }
        });
    </script>
</body>
</html>

v-bind:value和v-model的区别在于,v-model能通过表单数据的改变来更新绑定的数据值,实现双向绑定。

练习:使用双向绑定的特点来实现简单的计算器

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <input type="text" v-model="n1" @input="calc">
        <select v-model="opt" @change="calc">
            <option value="+">+</option>
            <option value="-">-</option>
            <option value="*">*</option>
            <option value="/">/</option>
        </select>
        <input type="text" v-model="n2" @input="calc">
        <button @click="calc">=</button>
        <input type="text" v-model="result" style="color: red;">
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                n1: 0,
                opt: "+",
                n2: 0,
                result: 0
            },
            methods: {
                calc(){
                    var str = "parseFloat('"+this.n1+"') "+this.opt+" parseFloat('"+this.n2+"')";
                    this.result = window.eval(str);
                }
            }
        });
    </script>
</body>
</html>

使用v-bind设置元素class和style

一般使用数组或对象来绑定,直接看实例即可:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test</title>
    <style type="text/css">
        .red{
            color: #abc;
        }
        .italic{
            font-style: italic;
        }
        .larg{
            font-size: 3em;
        }
    </style>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <h1>规则,就是用来打破的(无style)</h1>
        <!--原生class写法-->
        <h1 class="red italic larg">规则,就是用来打破的</h1>
        <!--v-bind场景一:使用数组-->
        <h1 :class="['red','italic','larg']">规则,就是用来打破的</h1>
        <!--场景二:使用三元表达式-->
        <h1 :class="['red','italic',flag?'larg':'']">规则,就是用来打破的</h1>
        <!--场景三:使用数组对象-->
        <h1 :class="['red','italic',{larg:flag}]">规则,就是用来打破的</h1>
        <!--场景四:直接使用对象-->
        <h1 :class="{red:false, italic:true, larg:true}">规则,就是用来打破的</h1>
        <!--动态绑定-->
        <h1 :class="app_class">规则,就是用来打破的</h1>
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                flag: false,
                app_class: {red:true, italic:false, larg:true}
            }
        });
    </script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <!--原生写法-->
        <h1 style="color: #abc;font-size: 30px;font-style: italic;">Jinx的含义就是Jinx.</h1>
        <!--使用对象-->
        <h1 :style="{color:'#217352','font-style':'30px','font-style':'italic'}">Jinx的含义就是Jinx.</h1>
        <!--使用数组-->
        <h1 :style="[{color:'#FF9800','font-style':'30px'},{'font-style':'italic'}]">Jinx的含义就是Jinx.</h1>
        <!--动态绑定-->
        <h1 :style="[sty1, sty2]">Jinx的含义就是Jinx.</h1>
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                flag: false,
                sty1: {color:'#aa9800','font-style':'30px'},
                sty2: {'font-style':'italic'}

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

使用v-for进行迭代

使用v-for可迭代数组、数组对象、对象以及数字。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <!--迭代数组-->
        <hr>
        <p v-for="(val,index) in arr">索引:{{index}};值:{{val}}</p>
        <!--迭代数组对象-->
        <hr>
        <p v-for="(val,index) in arr2">索引:{{index}};值:{{val.id}}={{val.name}}</p>
        <!--迭代对象-->
        <hr>
        <p v-for="(val,key,index) in obj">索引:{{index}};键:{{key}};值:{{val}}</p>
        <!--迭代数字-->
        <hr>
        <p v-for="val in 5">{{val}}</p>
    </div>

    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {
                arr: ['a','b','c','d','e'],
                arr2: [{id: '1', name:'Tom'},{id: '2', name: 'Json'}],
                obj: {id: '1',age:24,name: 'Micle'}
            }
        });
    </script>
</body>
</html>

使用v-for时key的注意事项
在组件中使用v-for时必须使用key属性,以标识迭代元素的唯一性。注意:key使用v-bind进行绑定,且值必须为字符串或数字。

v-if和v-show的使用

两者的值都是布尔值,根据传入的boolean来决定是否“显示”该元素。
v-ifv-show的区别在于,如果传入的值为true,前者才创建该元素否则不创建;而后者使用“display:none”来控制元素的显示效果,所以一定会创建出来。
所以,

案例

........
上一篇下一篇

猜你喜欢

热点阅读