vue.js

vue2.0基本用法

(npm run dev)

和angular有许多类似的地方,由于使用了大量ES6语法,所以不支持IE8以下版本

一、基本语法

vue实例最外层放一个<div id="app"></div>

1.{{}}:同angular一样,使用{{}}包裹变量

<h1>{{ name }}</h1>

同样,和angular一样,可以在{{}}里面写表达式,{{1+1}}{{Math.random()>0.5}}{{‘abc’.toUpperCase()}}{{ 10>30?30:60 }},注意,这里不能写if()else

2.v-model
和angular的ng-model类似,实现数据的双向绑定

<h1>{{ name }}</h1>
<input type="text" v-model="name" />

使用name变量之前,要先定义
创建模板对应的vue实例
var vm=new Vue({
    el:'#app',//el:elements Vue对应的根标签
    data:{//对应的数据
        name:'小明'
    }
})

在data中可以定义变量数组对象字符串

3遍历v-for(in/of)
不仅可以遍历数组元素,还可以遍历数组下标

    <ul>
        <li v-for="(person,i) of people">{{i+person.name}}</li>
    </ul>

var vm=new Vue({
    el:'#app',
    data:{
       people:[
          {name:'xiaoming'},
          {name:'xiaohong'},
        ]
    }
})

使用v-for遍历对象的value;

<li v-for="value in mine">{{value}}</li>

var vm=new Vue({
    el:'#app',
    data:{
       mine:{
          name:'xiaoming',
          age:18
        }
    }
})

v-for可以遍历对象的value和key值,注意value在前,key在后

<li v-for="(value,key) in mine">{{value}}{{key}}</li>

4.点击事件v-on:click="change"
无论使用什么事件,都是用v-on指令,后面跟事件名称即可,可以不加()在不传参的情况下

<h3 v-on:click="show">点击显示</h3>

定义函数时,要使用methods
var vm=new Vue({
    methods:{
        show:function(){
            console.log(event);
        }
        //可以简写成一下的形式ES6新语法
        show(){
            console.log(event)
        }
    }
})

如果想要得到里面的变量,可以直接写vm.变量名,如vm.show或vm.name;

5.v-if决定是否渲染,可以和v-else连用

<section v-if="flag">hhhh</section>
<section v-else>lksdjfkaldj</section>

6.v-show决定是否显示

<div v-show="flag">h2</div>

7.v-on添加事件

<button v-on:click="test1">按钮1</button>

可以简写成@
<button @click="test1">按钮1</button>

还可以写其他的事件
<button @mouseover="test2">按钮2</button>
<input type="text" @keyup='test3' />
等等

还可以添加修饰符,针对某一个按键起作用
<input type="text" @keyup.enter='test3' />
只用在点击enter键时,才会执行函数,注意,这样的针对某一个按键起作用,就必须绑定在键盘事件上
<input type="text" @keyup.up='test3' />上下键的上

同样也可以取消默认事件
<a href="http://www.baiu.com" @click.prevent="test4">baidu</a>

还可以取消冒泡
<a href="http://www.baiu.com" @click.stop="test4">baidu</a>

说到这里,可以复习一下原生的取消默认事件的方法,和取消冒泡的方法

event.stopPropagation取消冒泡事件
event.preventDefault;取消默认事件

8.v-bind绑定属性

<h2 v-bind:class="class"></h2>

同样可以简写成
<h2 :class="class"></h2>

不光可以写class,其他的属性都可以这样写,
在使用v-bind简写形式时,
必须加冒号,不然会把它里面的值当成一个字符串显示,而不是我们要的变量得形式

9.计算属性computed;

<h2>{{ aDouble }}</h2>
<h2>{{ aPlus }}</h2>
<input type="number" v-model="aPlus">

    var vm=new Vue({
        el:'#app',
        data:{
            a:10,
        },
        computed:{//计算属性
            aDouble:function(){
                return this.a*2;//这里的this.a==vm.a;
            },
            aPlus:{
                get:function(){
                    return this.a*2;
                },
                set:function(newValue){
                    console.log(newValue);
                    if(newValue>100){
                        this.a=100;
                    }else if(newValue<=0){
                        this.a=0;
                    }else{
                        this.a=newValue;
                    }
                }
            }
        }
    })

计算属性可以内部编写两个函数,分别是get和set,读取计算属性的时候走get方法,设置计算属性值得时候,就走set方法,set方法中的参数就是要设置的新值,可以再get方法内部进行条件判断,决定是否使用其新值

对于计算属性,直接当成普通属性使用即可
不能加括号作为函数使用 ,他代表一个函数的返回值
如果把它写在methods里面,那么他就是一个函数的方法

计算属性实现的效果,使用函数也都可以实现,,但是尽量使用计算属性,计算属性更加加高效,对于取值来说,只有当值发生改变,计算属性内部的函数才会执行一次,而函数会使用几次就执行几次

9.实例属性
vm.$data
vm.$el
vm.$parent
vm.$root
vm.$children
在路由分级时,会用到children

10.实例方法vm.$watch
同angular,

    // 使用$watch可以监测某个值得变化
    vm.$watch('a',function(newValue,oldValue){
        console.log("newValue="+newValue);
        console.log("oldValue="+oldValue);
    })
返回一个函数,用来停止触发回调
var unwatch = vm.$watch(‘a’, cb);
unwatch();

二、组件

类似于angular的自定义指令,用来封装重复使用的代码块

注册组件

如果需要换行,可以使用普通字符串,后面用\拼接,或者使用模板字符串
Vue.component('hello',{
        template:'<div>\
                        <h1>我是hello</h1>\
                        <p>我是HELLO标签</p>\
                        <p>我是HELLO标签{{msg}}</p>\
                    </div>',
        data(){//组件中的data数据,必须是函数,数据通过return进行返回


            // 组件中的data必须是函数的原因是:每个组件欧拥有自己独立的数据,不与其他共享,因为共享数据后,会相互影响,导致数据错乱
            return {
                msg:'message'
            };
        }
    })

在html代码中,只需要加入<hello></hello>就可以了

这是一个全局的标签
其中template对应的是被替换过去的HTMl模板结构;
必须存在一个跟标签(root element)

下面创建一个局部的实例

    var vm=new Vue({
        el:'#app',
        components:{//局部组件直接写在实例的components中,其他实例无法使用。
            hi:{
                template:'<h2>我是hi标签</h2>'
            }
        }
    })

父组件与子组件的传值props

在这里需要提一下引用类型;
数组和对象都是引用类型,其他的都是普通的值类型

var arr=[1,2,3,4];
var arr2=arr;
arr2.push(5);
此时arr与arr2同时都变成了[1,2,3,4,5];
这是因为arr定义一个数组,就会开创一个空间,并把值都传到空间,然后arr指向了这个空间,定义一个arr2,让他等于arr,这时arr2也指向了这个空间,所以通过这两个随意改变指都会影响到另一个,这样的数组就是引用型。此仅为个人理解。

组件内部的props里面的值都是组件的属性,用于接受外界的值,然后赋值到组件内部

<my-component :msg="msg"></my-component>

    Vue.component('my-component',{
        props:['msg'],//props用于接受外界传递的值
        template:'<p>message={{msg}}</p>'
    })
 父组件与子组件之间的传值
<my-component :msg="msg"></my-component>
这里的msg是一个变量

    Vue.component('my-component',{
        props:['msg'],//props用于接受外界传递的值
        template:'<p>message={{msg}}</p>'
    })
    var vm=new Vue({
        el:'#app',
        data:{
            msg:'message'
        }
    })

在页面显示的<p>message=message</p>

这里的props是单向数据流的,但是对于引用类型的数组对象不能单向;

使用slot分发
作用类似于angular的ng-transclude嵌套元素;

    Vue.component('my-app',{
        template:`
                <div>
                    <p>我是my-app</p>
                    <slot>如果没有分发内容,显示我</slot>
                    <slot name="header">如果没有分发内容,显示我</slot>

                </div>`
        
    })


具名slot的使用
        <my-app>
            <h2 slot="header">h2</h2>
            <hr>
            <h3 slot="footer">h3</h3>
            <hr>
            <h4>h4</h4>
        
        </my-app>

如果写两遍slot,那么就会打印两遍,但会报错;但是,如果把他变成具名属性,就可以正常使用了

// export导出
// import导入

三、使用vue做一个项目

命令行内:
1.通过命令行安装vue脚手架
npm install -g vue-cli

2设置项目名称
vue init webpack 项目名

cd 项目名

npm install

npm run dev运行项目默认打开8080端口

路由

路由安装
npm install vue-router

npm run dev

完成之后进行的步骤:
在main.js中

1.import VueRouter from 'vue-router'//引入路由文件

引入home

import Home from 'home'

//2.安装插件main.js

Vue.use(VueRouter)

3.编写页面在app.js

 <router-link to="/home"></router-link>

4.定义路由main.js

const routes=[
    {path:'/home',component:Home}
    path对应的是app.js 中to="/home"
    components对应的是引入的名称
]

其中的

const routes=[
    { path: '/', component: Home }
      表示打开默认显示home页面
]

5创建VueRouter实例main.js

const router = new VueRouter({
    routes//这是简写(routes:routes)
})

6.在main.js中的

new Vue({
  el: '#app',
  template: '<App/>',
  components: { App },
添加:
  router
})

添加一个文件夹在src文件夹下,里面添加我们需要的页面,每个页面只需要一个后缀名为vue的文件,里面就包含了html,css和js的所有内容。其中html写在<template></template>内,并且在里面添加一个根标签,把内容都放在我们设置的跟标签里面

和angular不同的是,路由跳转没有直接使用a标签的锚点,而是有它专用的标签
<router-link to="/home">首页</router-link>
,同样,也不需要使用ui-view,而是它专用的
<router-view></router-view>

replace属性

<router-link :to="/home" replace></router-link>//页面切换不会留下历史痕迹

tag属性,会渲染成tag指定的标签

<router-link :to="/home" tag="li">Home</router-link><li>Home</li>

active-class属性
这个属性是设置激活链接时的class属性

<router-link :to="/home" active-class="active">Home</router-link>

active-class属性的默认值是router-link-active

exact属性
开启router-link的严格模式

<router-link :to="/" exact>home</router-link>

二级路由

先引入
import One from 'one',
import two from 'two',

const router=[
    {path:'/home',component:Home,children:[
        {path:'one',component:One},
        {path:'two',component:two},
    ]}
]

 <router-link to="/home/one">One</router-link>
<router-view></router-view>

网络请求
npm install vue-resource
安装

Vue.use(VueResource)


export default{
    data(){
        return {
            data:[]//把返回的数据都放到数组中
        }
    },
    mounted(){
        this.$http.get().then(function(res){
            console.log(res);
            // console.log(JSON.parse(res.body).data);
            this.data=JSON.parse(res.body).data;
        })
    }
}

网络请求使用mounted

引用第三方js库:

在需要的.vue文件中,script里面引入;
import $ from '../../static/lib/jquery-3.1.1.min.js'

就这么简单

export default{
    data(){
        return (
            //定义的变量写这里
            data:[];
            name:'xiaoming'
        )
    },
    mounted(){
        //js代码写在这里
       在引用swiper时,把swiper的js代码放到这里,如果是动态创建的元素,
       建议用setTimeout包住
           new Swiper ('.swiper-container', {
                direction: 'horizontal',
                loop: true,
                autoplay:2000,
                speed:1000,
                autoplayDisableOnInteraction:false,
                pagination: '.swiper-pagination',
            })
    },
    methods:{//方法写这里
        get(){}
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容