移动互联网React Native@IT·互联网

移动互联网的第二个浪潮

2017-01-09  本文已影响1261人  撩课_叶建华

先聊一聊昨晚发生的事

前言

Vue.js可以用来干嘛?

Vue.js快速入门

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue.js入门</title>
</head>
<body>
   <div id="app">
       {{message}}
   </div>
   
<!--引入Vue.js生产包-->
<script src="js/vue.js"></script>
<script>
    (function () {
        var app = new Vue({
            el: '#app',   // el是作用域
            data: {      // 数据,json格式
                message: '小码哥 旋之华'
            }
        })
    })();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue.js入门</title>
</head>
<body>
   <div id="app">
       <!--
          数据关联在message, 只要文本框中的数据改变, p标签中的数据也会进行联动改变
       -->
       <input type="text" v-model="message">
        <!--
          <p>{{* message}}</p>  如果在前面加*号,则只会被加载一次
       -->
       <p>{{message}}</p>
   </div>

<script src="js/vue.js"></script>
<script>
    (function () {
        var app = new Vue({
            el: '#app',
            data: {
                message: '全局数据 一改全改!'
            }
        })
    })();
</script>
</body>
</html>

上述案例中用到了v-model指令,v-model指令可以在表单控件元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但v-model本质上不过是语法糖,它负责监听用户的输入事件以更新数据,并特别处理一些极端的例子。

轻松搞定Vue.js中常用指令

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-for</title>
</head>
<body>
<div id="app">
    <!--
       根据数据的类型往标签中动态注入内容
    -->
    <p v-html="html"></p>
    <p v-text="text"></p>
</div>

<script src="js/UnderScore-min.js"></script>
<script src="js/vue.js"></script>
<script>
    // 1. 构造器
    var app = new Vue({
        el: '#app',
        data: {
            html: '<div>![](http:https://img.haomeiwen.com/i1268909/75ea58436edb6483.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)<p>大家好,我是旋之华!</p></div>',
            text: 'Hello, world!'
        }
    });

</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-if</title>
</head>
<body>
   <div id="app">
      <!--
        语法格式: xx of xxs
      -->
      <p v-for="item of items">
         {{ item.name }}
      </p>
   </div>

<script src="js/UnderScore-min.js"></script>
<script src="js/vue.js"></script>
<script>
    // 1. 构造器
    var app = new Vue({
        el: '#app',
        data: {
            items: [
                {name: '张三丰'},
                {name: '章四风'},
                {name: '张五分'},
                {name: '占六分'}
            ]
        }
    });

    // 2. 往构造器的数据数组中添加数据
    app.items.push({name: '占七分'});

    // 3. 从构造器的数据数组中删除数据
    app.items.pop();

    // 4. 往构造器的数据数组最前面插入元素
    app.items.unshift({name: '小二'});

</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-if</title>
</head>
<body>
   <div id="app">
       <p>旋之华的考试的分数是: {{score}} </p>
       <!-- v-if:最终的运算结果, boolean类型 -->
       <p v-if="score >= 80">成绩优秀!</p>
       <p v-else>成绩及格!</p>

       <p>{{ result ? '结果是真的' : '结果是假的' }}</p>
   </div>

<script src="js/UnderScore-min.js"></script>
<script src="js/vue.js"></script>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            score: _.random(60, 100),    // 注意:在Vue的数据中心是具备运算功能的
            result: false                // 采用三目运算符的方式
        }
    });
</script>
</body>
</html>
  <!-- 完整语法 -->
  <a v-on:click="doSomething"></a>
  <!-- 缩写 -->
  <a @click="doSomething"></a>

通过v-on,我们就可以操作数据控制界面的改变,这就在慢慢的去接近了MVVM的设计模式。具体请参照下面案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-on</title>
</head>
<body>
   <div id="app">
       <p>做出的题数:{{count}}</p>
       <p>每道题的分数:{{scoreValue}}</p>
       <p>最终成绩:{{countScore}}</p>
       <button v-on:click="plus">点我+1</button>
       <button @click="minus">点我-1</button>
   </div>

<script src="js/UnderScore-min.js"></script>
<script src="js/vue.js"></script>
<script>
    // 1. 构造器
    var app = new Vue({
        // 1.0 作用域
        el: '#app',

        // 1.1 初始数据
        data: {
            count: 0, // 已做题数
            scoreValue: 5, // 每题5分
            countScore: 0  // 总得分
        },

        // 1.2 定义方法
        methods: {
            // 做对一道题目
            plus: function () {
                this.count ++;
                if(this.countScore >= 100){
                    this.countScore = 100;
                    this.count = 100 / this.scoreValue;
                    alert('你已经对的够多了!');
                }
                this.countScore = this.count * this.scoreValue
            },
            // 做错一道题目
            minus: function () {
                this.count --;
                if(this.countScore <= 0){
                    this.countScore = 0;
                    this.count = 0;
                    alert('你已经不能再错了!');
                }
                this.countScore = this.count * this.scoreValue
            }
        },

        // 1.3 监听数据的改变
        watch: {
           "countScore": function () { // 监听总分数的变化
               if(this.countScore == 90){
                   alert('成绩达到优秀');
               }
           }
        }
    });

</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-show</title>
</head>
<body>
<div id="app">
    <!--
       根据数据的类型往标签中动态注入内容
    -->
    <p v-html="html" v-show="flag"></p>
    <p v-text="text" v-if="flag"></p>

    <button @click="change">切换</button>
</div>

<script src="js/UnderScore-min.js"></script>
<script src="js/vue.js"></script>
<script>
    // 1. 构造器
    var app = new Vue({
        el: '#app',

        data: {
            html: '<div>![](http://upload-images.jianshu.io/upload_images/1268909-75ea58436edb6483.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)<p>大家好,我是旋之华!</p></div>',
            text: 'Hello, world!',
            flag: true // 用于控制标签的显示和隐藏
        },

        methods: {
            // 控制标签的显示和隐藏
            change: function () {
                this.flag = (this.flag == true) ? false : true;
            }
        }
    });

</script>
</body>
</html>

v-show 和 v-if 都能够实现标签的显示和隐藏,主要区别在于:v-if是预加载,调用的是js,显示的速度比较慢,一般用于逻辑比较复杂,又需要被多次调用的场景; v-show是没有预加载的,控制的是CSS标签,显示速度比较快。

<!-- 完整语法 -->
<a v-bind:href="url"></a>
<!-- 缩写 -->
<a :href="url"></a>
    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>v-bind</title>
    <style>
        .green{
            background-color: green;
        }

        .size{
            width:100px;
            height: 100px;
        }

        .bg-color{
            background-color: orangered;
        }

        .class-A{
            background-color: red;
        }

        .class-B{
            width: 200px;
            height: 200px;
            padding: 100px;
        }

        .class-C{
            border-radius: 50%;
        }
    </style>
</head>
<body>
<div id="app">
    <!--动态绑定标签的src属性-->
    ![](imgSrc)
    ![](imgSrc)

    <!--
    给v-bind:class一个对象,可以动态地切换class;
    此外, 也可以在对象中传入更多属性用来动态切换多个class,
    而且v-bind:class指令可以与普通的 class 属性共存
    -->
    <p :class="{'green': isGreen}">根据数据决定是否加载css的green样式</p>
    <p :class="{'size': isSize, 'bg-color': isBgColor}">同时设置多个css样式</p>
    <p :class="['class-A', 'class-B', 'class-C']">通过数组设置多个样式</p>

    <!--
    给v-bind:style一个对象,可以动态地切换style;
    -->
    <p :style="{backgroundColor: bgColor, width: width, height: height}">设置行内样式</p>
    <p :style="[styleA, styleB, styleC]">可以通过数组设置多个行内样式</p>
</div>

<script src="js/UnderScore-min.js"></script>
<script src="js/vue.js"></script>
<script>
    // 1. 构造器
    var app = new Vue({
        el: '#app',
        data: {
           imgSrc: 'http://h.hiphotos.baidu.com/image/pic/item/72f082025aafa40f7c884d31af64034f79f0198b.jpg',
           isGreen: true, // 加载green样式
           isSize: true,
           isBgColor: true,

           bgColor: 'blue',
           width: '200px',
           height: '300px',

           styleA:{
               fontSize: '30px'
           },

           styleB:{
               width: '200px',
               height: '200px',
               backgroundColor:'yellow',
               padding:'40px'
           },

           styleC:{
                borderRadius: '50%'
           }
        }
    });

</script>
</body>
</html>

写在最后

上一篇 下一篇

猜你喜欢

热点阅读