Vue.js入门(1)常用命令

序言

很多人不成功的原因主要是太尊重自己了

常用命令

基本的Vue代码结构

<!DOCTYPE html>
<html>
<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="vue.js"></script>
</head>
<body>
    <!-- 将来 new 的Vue实例,会控制这个 元素中的所有内容 -->
    <!-- Vue 实例所控制的这个元素区域,就是我们的 V  -->
    <div id="app">
        <p>{{ msg }}</p>
    </div>

    <script>
        // 2. 创建一个Vue的实例
        // 当我们导入包之后,在浏览器的内存中,就多了一个 Vue 构造函数
        //  注意:我们 new 出来的这个 vm 对象,就是我们 MVVM中的 VM调度者
        var vm = new Vue({
            el: '#app',  // 表示,当前我们 new 的这个 Vue 实例,要控制页面上的哪个区域
            // 这里的 data 就是 MVVM中的 M,专门用来保存 每个页面的数据的
            data: { // data 属性中,存放的是 el 中要用到的数据
                msg: '欢迎学习Vue' // 通过 Vue 提供的指令,很方便的就能把数据渲染到页面上,程序员不再手动操作DOM元素了【前端的Vue之类的框架,不提倡我们去手动操作DOM元素了】
            }
        })
    </script>
</body>
</html>
View Code

v-cloak:插值表达式

<!-- 使用 v-cloak 能够解决 插值表达式闪烁的问题 -->
<p v-cloak>++++++++ {{ msg }} ----------</p>
View Code

v-text:

<h4 v-text="msg">==================</h4>
<!-- 默认 v-text 是没有闪烁问题的 -->
<!-- v-text会覆盖元素中原本的内容,但是 插值表达式  只会替换自己的这个占位符,不会把 整个元素的内容清空 -->
View Code

v-html:渲染输出html

<div v-html="msg2">1212112</div>
View Code

v-bind:Vue提供的属性绑定机制 缩写是 :

 <!-- v-bind: 是 Vue中,提供的用于绑定属性的指令 -->
<!-- <input type="button" value="按钮" v-bind:title="mytitle + '123'"> -->
<!-- 注意: v-bind: 指令可以被简写为 :要绑定的属性 -->
<!-- v-bind 中,可以写合法的JS表达式 -->
View Code

v-on:Vue提供的事件绑定机制 缩写是 @

<!-- Vue 中提供了 v-on: 事件绑定机制 -->
<!-- <input type="button" value="按钮" :title="mytitle + '123'" v-on:click="alert('hello')"> -->
<input type="button" value="按钮" @click="show">
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                msg: '123',
                msg2: '<h1>哈哈</h1>',
                mytitle: '这是一个自己定义的title'
            },
            methods: { // 这个 methods属性中定义了当前Vue实例所有可用的方法
                show: function () {
                    alert('Hello')
                }
            }
        })
    /* document.getElementById('btn').onclick = function(){
      alert('Hello')
    } */
    </script>
View Code

绑定@click事件

<!DOCTYPE html>
<html>
<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="vue.js"></script>
</head>
<body>
    <!-- 创建一个要控制的区域 -->
    <div id="app">
        <h4>{{ msg }}</h4>
        <input type="button" value="开始" @click="start">
        <input type="button" value="停止" @click="stop">
    </div>

    <script>
        // 注意:在 VM实例中,如果想要获取 data 上的数据,或者 想要调用 methods 中的 方法,必须通过 this.数据属性名  或  this.方法名 来进行访问,这里的this,就表示 我们 new 出来的  VM 实例对象
        var vm = new Vue({
            el: '#app',
            data: {
                msg: '提示',
                intervalId: null // 在data上定义 定时器Id
            },
            methods: {
                start() {
                    alert("start" + this.msg);
                },
                stop() {
                    alert("stop" + this.msg);
                }
            }
        })
    </script>
</body>
</html>
View Code

事件修饰符

使用.stop阻止冒泡

<input type="button" value="点击" @click.stop="btnHandler">
<body>
    <div id="app">
        <div class="inner" @click="div1Handler">
            <input type="button" value="点击" @click.stop="btnHandler">
        </div>
    </div>

    <script>
          var vm = new Vue({
              el: '#app',
              data: {},
              methods: {
                  div1Handler() {
                      console.log('这是触发了 inner div 的点击事件')
                  },
                  btnHandler() {
                      console.log('这是触发了 btn 按钮 的点击事件')
                  }
              }
          });
    </script>
</body>
View Code

 使用.prevent阻止默认行为

 <a href="http://www.baidu.com" @click.prevent="linkClick">有问题,先去百度</a> 

 使用.capture实现捕获触发事件的机制

 <div class="inner" @click.capture="div1Handler">
        <input type="button" value="戳他" @click="btnHandler">
</div>

使用.self 实现只有点击当前元素时候,才会触发事件处理函数

<div class="inner" @click="div1Handler">
            <input type="button" value="戳他" @click="btnHandler">
</div>

使用.once只触发一次事件处理函数

<a href="http://www.baidu.com" @click.prevent.once="linkClick">有问题,先去百度</a> 

.stop.self的区别

<div class="outer" @click="div2Handler">
            <div class="inner" @click="div1Handler">
                <input type="button" value="戳他" @click.stop="btnHandler">
            </div>
</div>

.self只会阻止自己身上冒泡行为的触发,并不会真正阻止 冒泡的行为

<div class="outer" @click="div2Handler">
          <div class="inner" @click.self="div1Handler">
            <input type="button" value="戳他" @click="btnHandler">
          </div>
</div> 

 v-model双向绑定

注意: v-model 只能运用在 表单元素中
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <h4>{{ msg }}</h4>
        <!-- v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法实现数据的双向绑定  -->
        <!-- <input type="text" v-bind:value="msg" style="width:100%;"> -->
        <!-- 使用  v-model 指令,可以实现 表单元素和 Model 中数据的双向数据绑定 -->
        <!-- 注意: v-model 只能运用在 表单元素中 -->
        <!-- input(radio, text, address, email....)   select    checkbox   textarea   -->
        <input type="text" style="width:100%;" v-model="msg">
    </div>

    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                msg: '大家都是好学生,爱敲代码,爱学习,爱思考,简直是完美,没瑕疵!'
            },
            methods: {
            }
        });
    </script>
</body>
</html>
View Code

 简易计算器

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="vue.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="calc">

        <input type="text" v-model="result">
    </div>

    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                n1: 0,
                n2: 0,
                result: 0,
                opt: '+'
            },
            methods: {
                calc() { // 计算器算数的方法
                    // 逻辑:
                    /* switch (this.opt) {
                      case '+':
                        this.result = parseInt(this.n1) + parseInt(this.n2)
                        break;
                      case '-':
                        this.result = parseInt(this.n1) - parseInt(this.n2)
                        break;
                      case '*':
                        this.result = parseInt(this.n1) * parseInt(this.n2)
                        break;
                      case '/':
                        this.result = parseInt(this.n1) / parseInt(this.n2)
                        break;
                    } */

                    // 注意:这是投机取巧的方式,正式开发中,尽量少用
                    var codeStr = 'parseInt(this.n1) ' + this.opt + ' parseInt(this.n2)'
                    this.result = eval(codeStr)
                }
            }
        });
    </script>
</body>
</html>
View Code

vue中样式:class

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="vue.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">
        <!-- <h1 class="red thin">这是一个很大很大的H1,大到你无法想象!!!</h1> -->
        <!-- 第一种使用方式,直接传递一个数组,注意: 这里的 class 需要使用  v-bind 做数据绑定 -->
        <!-- <h1 :class="['thin', 'italic']">这是一个很大很大的H1,大到你无法想象!!!</h1> -->
        <!-- 在数组中使用三元表达式 -->
        <!-- <h1 :class="['thin', 'italic', flag?'active':'']">这是一个很大很大的H1,大到你无法想象!!!</h1> -->
        <!-- 在数组中使用 对象来代替三元表达式,提高代码的可读性 -->
        <!-- <h1 :class="['thin', 'italic', {'active':flag} ]">这是一个很大很大的H1,大到你无法想象!!!</h1> -->
        <!-- 在为 class 使用 v-bind 绑定 对象的时候,对象的属性是类名,由于 对象的属性可带引号,也可不带引号,所以 这里我没写引号;  属性的值 是一个标识符 -->
        <h1 :class="classObj">这是一个很大很大的H1,大到你无法想象!!!</h1>
    </div>

    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                flag: true,
                classObj: { red: true, thin: true, italic: false, active: false }
            },
            methods: {}
        });
    </script>
</body>
</html>
View Code

 vue中样式:style

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <!-- 对象就是无序键值对的集合 -->
        <!-- <h1 :style="styleObj1">这是一个h1</h1> -->
        <h1 :style="[ styleObj1, styleObj2 ]">这是一个h1</h1>
    </div>

    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                styleObj1: { color: 'red', 'font-weight': 200 },
                styleObj2: { 'font-style': 'italic' }
            },
            methods: {}
        });
    </script>
</body>
</html>
View Code

v-for

 v-for循环普通数组

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <!-- <p>{{list[0]}}</p>
        <p>{{list[1]}}</p>
        <p>{{list[2]}}</p>
        <p>{{list[3]}}</p>
        <p>{{list[4]}}</p> -->

        <p v-for="(item, i) in list">索引值:{{i}} --- 每一项:{{item}}</p>

    </div>

    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                list: [1, 2, 3, 4, 5, 6]
            },
            methods: {}
        });
    </script>
</body>
</html>
View Code

v-for循环对象数组

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="vue.js"></script>
</head>
<body>
    <div id="app">
        <p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引:{{i}}</p>
    </div>

    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                list: [
                    { id: 1, name: 'zs1' },
                    { id: 2, name: 'zs2' },
                    { id: 3, name: 'zs3' },
                    { id: 4, name: 'zs4' }
                ]
            },
            methods: {}
        });
    </script>
</body>
</html>
View Code

v-for循环对象

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app">
        <!-- 注意:在遍历对象身上的键值对的时候, 除了 有  val  key  ,在第三个位置还有 一个 索引  -->
        <p v-for="(val, key, i) in user">值是: {{ val }} --- 键是: {{key}} -- 索引: {{i}}</p>
    </div>

    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                user: {
                    id: 1,
                    name: '托尼·大颗',
                    gender: ''
                }
            },
            methods: {}
        });
    </script>
</body>

</html>
View Code

v-for迭代数字

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app">
        <!-- in 后面我们放过  普通数组,对象数组,对象, 还可以放数字 -->
        <!-- 注意:如果使用 v-for 迭代数字的话,前面的 count 值从 1 开始 -->
        <p v-for="count in 10">这是第 {{ count }} 次循环</p>
    </div>

    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {},
            methods: {}
        });
    </script>
</body>

</html>
View Code

v-for循环中key属性的使用

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app">

        <div>
            <label>
                Id:
                <input type="text" v-model="id">
            </label>

            <label>
                Name:
                <input type="text" v-model="name">
            </label>

            <input type="button" value="添加" @click="add">
        </div>

        <!-- 注意: v-for 循环的时候,key 属性只能使用 number获取string -->
        <!-- 注意: key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值 -->
        <!-- 在组件中,使用v-for循环的时候,或者在一些特殊情况中,如果 v-for 有问题,必须 在使用 v-for 的同时,指定 唯一的 字符串/数字 类型 :key 值 -->
        <p v-for="item in list" :key="item.id">
            <input type="checkbox">{{item.id}} --- {{item.name}}
        </p>
    </div>

    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                id: '',
                name: '',
                list: [
                    { id: 1, name: '李斯' },
                    { id: 2, name: '嬴政' },
                    { id: 3, name: '赵高' },
                    { id: 4, name: '韩非' },
                    { id: 5, name: '荀子' }
                ]
            },
            methods: {
                add() { // 添加方法
                    this.list.unshift({ id: this.id, name: this.name })
                }
            }
        });
    </script>
</body>

</html>
View Code

v-if和v-show的使用

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="app">

        <!-- <input type="button" value="toggle" @click="toggle"> -->
        <input type="button" value="toggle" @click="flag=!flag">

        <!-- v-if 的特点:每次都会重新删除或创建元素 -->
        <!-- v-show 的特点: 每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式 -->
        <!-- v-if 有较高的切换性能消耗 -->
        <!-- v-show 有较高的初始渲染消耗 -->
        <!-- 如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show -->
        <!-- 如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if -->
        <h3 v-if="flag">这是用v-if控制的元素</h3>
        <h3 v-show="flag">这是用v-show控制的元素</h3>

    </div>

    <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
            el: '#app',
            data: {
                flag: false
            },
            methods: {
                /* toggle() {
                  this.flag = !this.flag
                } */
            }
        });
    </script>
</body>

</html>
View Code

  v-if 的特点:每次都会重新删除或创建元素

  v-show 的特点: 每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式

  v-if 有较高的切换性能消耗

  v-show 有较高的初始渲染消耗

  如果元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show

  如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if

常用插件

Vue使用Ref跨层级获取组件实例

npm install vue-ref --save

资料

https://blog.csdn.net/weixin_39927850/article/details/79105297

https://cn.vuejs.org/v2/guide/instance.html

posted @ 2018-01-25 21:52  ~沐风  阅读(437)  评论(0编辑  收藏  举报