Vue学习笔记

基本使用:

vue init webpack vue-demo

结构:

```

new Vue({

el:'#app',

data:{

...

},

methods:{

....

}

})

```

<!-- 绑定属性 v-bind:xxx 缩写:xxx --> <div v-bind:title="title">鼠标喵上去看一下</div>

<!-- 绑定html v-html --> <div v-html="h"></div>

绑定文字:{{xxx}}=v-text

<li v-for="(item,key) in 数组" :class="{'red':key==1,'blue':key==0}">{{key}}----{{item}}</li>

<div :class="{'red':flag,'blue':!flag}">xxxxxx</div>

<div :class="[class类名,class类名1]">xxxxxx</div>

<div class="box" v-bind:style="{width:boxWidth+'px'}"></div>

v-if代表节点不存在   v-show是将display设置成了none,不支持template标签(性能开销小)

key值要使用id,不要使用index

通过$refs获取dom节点  this.$refs.xxxx

v-on:click=   @click=    input---@change

@click.stop 阻止事件冒泡

@click.prevent 阻止默认事件

@click.prevent.stop 同时阻止冒泡和默认事件

@click.once 只执行一次

vue实现多选 

<input type="checkbox" v-modal=''a'' value="0"/>注意多个要设置不同的value值

单选 type="radio" name属性 表示是否多个radio属于同一个组

下拉框 <select v-model="selected1">  <option value="0">唱歌</option> </select>

修饰符

v-model.lazy 光标离开时触发

v.model.trim 过滤首尾空格

v.model.number 只能输入数字

//every()检测数组元素是否都符合要求,都符合返回true,只要有一个没有符合返回false

引入组件的方式:1、引入组件2、挂载组件3. 在模板中运行

scoped代表有作用域,css只生效于当前页面

xxxx.sync 同步状态变化 this.emit(‘update:xxxx’,v)

数据不刷新的问题:

1.Vue.set(vm.items,index,value)

2.Vue.$set(vm.items,index,value)

3.splice(在哪添加(索引),添加的数量,添加的是数据(可多个))


生命周期

beforeCreate  '实例创建之前'

created  '实例创建完成'

beforeMount '模板编译之前'

mounted  数据请求应该放在此处   '模板编译完成'

beforeUpdate '数据更新之前'

updated  '数据更新完成'

beforeDestroy  '实例销毁之前'

destroyed '实例销毁完成'

computed 计算属性 (和方法的不同之处计算属性有缓存)

watch 

watch:{

    //‘name’:'action'  action是methods里面的方法

    name(newValue,oldValue){

    }

    obj:{

        handler:(newValue,oldValue)=>{

        },

        deep:true//深度监听

    }

}

修改对象 this.$set(this.obj,'age',20)

删除属性 this.$delete(this.obj,'age')

请求数据的方式

vue-resource  this.$http.get(api).then(xx)

axios  Axios.get(api).then(xx)

父子组件传参

<v-header :title="title" :fun="fun" :home="this"></v-header>

props:{'title':String,'fun':Function,'home':Object} 注意:和methods并列

父组件调用子组件的时候,绑定动态属性

在子组件里面通过props接受

this.$parent.父组件的data值 

父传子,:aaa,子组件用props接收

子传父,@aaa,子组件用this.$emit(‘aaa’,xxx)调用父组件传入的事件。

组件定义

Vue.component('aaaa',{

    data:function(){return {count:0}}
    template:'<div>{{count}}</div>'

})

解决浏览器渲染闪烁的问题

v-cloak  设置样式:[v-cloak]{display:none}

父组件主动获取子组件的方法

*  1、调用子组件的时候定义ref         <v-header ref="header"></v-header>

*  2、在父组件通过 this.$refs.header.属性/方法  获取

子组件主动获取父组件的方法      

this.$parent.数据、this.$parent.方法

非父子组件之间的传值

* 1、新建js文件,引入vue,进行实例化,暴露出此实例

* 2、在要广播的地方引入定义的实例

* 3、调用 实例名.$emit('名称',数据)

* 4、接受 实例名.$on('名称',function)

自定义v-model

父 <子 v-model="name"/>

子 <Input type="text" :value="text" @input="$emit('change',$event.target.value)"

export default{

model:{

props:'text', //对应props的text

event:'change' //$emit触发的事件要和此处对应

},

props:{

text:String,

default(){

return ''

}

}

}

匿名插槽

A:<div><slot></slot></div>.  B: <A><span>123123</span></A>

注:不能存在多个slot

具名插槽

A:<div><slot name="header"></slot></div>  B:<A><div slot="header">aaaa</div></A>

作用域插槽 在某个地方换一个样式来渲染某一部分内容

A:<div><slot content="123123"></slot></div>
B:<A><template slot-scope="props"><h1>{{props.content}}</h1></template></A>

动态组件

<component :is="组件名"></component>

keep-alive 组件缓存

      include: 只有匹配的组件才会缓存,符合条件:字符串/正则

      exclude: 任何组件都不会缓存,符合条件:字符串/正则

v-enter:进场动画的开始状态

v-enter-to:进场动画的一个结束状态

v-enter-active:进场动画生效时的状态

把要加过渡动画的元素加在<transition>标签里面

vue-router的使用

1、创建组件

2、配置路由

3、实例化vue-router

4、挂载路由

5、<router-view></router-view>放在app.vue根组件里面

vue路由导航跳转方式

声明式 <router-link :to="...">

声明式常见方式

to="/home"

to="{name:home}"

to="{path:'home',query:{id:10}}" 地址栏/home?id=10

to="{name:'home',query:{id:10}}" 地址栏/home?id=10

to="{path:'home',params:{id:10}}" 直接路由带路由参数params,params不生效,如果提供了path,params会被忽略

to="{name:'home',params:{id:10}}" 地址栏/home/10

编程式  router.push(...)

编程式常见方式

router.push('/home')

router.push({path:'homename'})

router.push({path:'home',query:{id:10}})

router.push({name:'home',query:{id:10}})

router.push({path:'home',params:{id:10}})

router.push({name:'home',params:{id:10}})

params方式传参,需要在路由中配置参数

{path:'/news/:id',component:News}

页面中接受参数:$route.params.id

路由重定向和别名:

ex:{path:'*', redirect:'/home'}

路由拦截(在路由文件中拦截)

//next:Function,进行管道中的一个钩子,如果执行完了,则导航的状态就是 confirmed (确认的);否则为false,终止导航。

router.beforeEach(function(to, from, next) {

  if(!sessionStorage.getItem('sign')){

    if(to.path !=='/home'){

      alert('请签到!');

      next();

    }

  }

  next()

})

钩子函数:

全局:

beforeEach:在路由切换时开始调用

afterEach:在路由切换离开时调用

局部到单个路由:
beforeEnter

组件的钩子函数:

beforeRouterEnter,

beforeRouterUpdate,

beforeRouterLeave

包含三个参数 

to:即将进入的导航对象

from:当前要离开的导航对象

next:是一个函数,调用resolve 执行下一步

自定义组件的data必须是一个函数返回对象,主要是防止组件之间作用域相互影响.

动态路由

1、配置动态路由

* routes: [// 动态路径参数 以冒号开头{ path: '/user/:id', component: User }]

* get方法传值 :to="'/newDetail?aid='+item.aid"  用this.$route.query获取

2、this.$route.params获取动态路由的值

vue使用mint-ui

import 'mint-ui/lib/style.css'

import Mintfrom 'mint-ui';

Vue.use(Mint);

vue使用element-ui

import ElementUI from 'element-ui';

import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI);

*webpack.config.js 配置file_loader      http://element.eleme.io/1.4/#/zh-CN/component/quickstart

{test: /\.(eot|svg|ttf|woff|woff2)(\?\S*)?$/,loader: 'file-loader'}

*结合官方文档使用

Vuex

Vuex是一个专为 Vue.js 应用程序开发的状态管理模式

    1.vuex解决了组件之间同一状态的共享问题  (解决了不同组件之间的数据共享)

    2.组件里面数据的持久化。               

*小项目不部建议用vuex 

vuex的使用:

1、src目录下面新建一个vuex的文件夹

2、vuex 文件夹里面新建一个store.js

3、安装vuex 

cnpm install vuex --save

4、在刚才创建的store.js引入vue  引入vuex 并且use vuex

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)

5、定义数据

/*1.state在vuex中用于存储数据*/

var state={count:1}

6、定义方法 mutations里面放的是方法,方法主要用于改变state里面的数据

var mutations={incCount(){++state.count;}}

7、类似vue里面的计算属性 , 改变state里面的count数据的时候会触发 getters里面的方法 获取新的值 (基本用不到)

var getters= {computedCount: (state) => {return state.count*2 }}

8、 Action 基本没有用

Action 类似于 mutation,不同在于:

mutation 提交的是 mutation,而不是直接变更状态。

Action 可以包含任意异步操作。

var actions= {

    incMutationsCount(context) {    /*因此你可以调用 context.commit 提交一个 mutation*/

        context.commit('incCount');    /*执行 mutations 里面的incCount方法 改变state里面的数据*/

    }}

暴露

const store = new Vuex.Store({

    state,

    mutations,

    getters,

    actions

})

export default store;

组件里面使用vuex:

1.引入 store

import store from '../vuex/store.js';

2、注册

export default{

data(){ return {}},

store,

methods:{incCount(){this.$store.commit('incCount');  /*触发 state里面的数据*/} }

3、获取state里面的数据 

this.$store.state.数据

4、触发 mutations 改变 state里面的数据

this.$store.commit('incCount');

5、触发 actions里面的方法

this.$store.dispatch('incCount');

6、获取 getters里面方法返回的的数据 

this.$store.getters.computedCount

注意:export default 一个  import 一个 from xxx.js 

双向数据绑定 

var obj = {};

            //修改单个属性

            Object.defineProperty(obj, 'name', {

                  value: 'asdd',

                  writable: true,//当前属性是否可以被修改

            })

            //修改多个属性

            Object.defineProperties(obj, {

                  'name': {

                        value: '123213',

                        writable: true

                  },

                  'age': {

                        value: 10,

                        writable: false

                  }

            })

            //存取方法 getter setter

            var a=0;

            Object.defineProperty(obj, 'name', {

                  get: function () {

                        console.log('get');

                        return a

                  },

                  set: function (val) {

                        console.log('set');

                        a = val

                  }

            });

最后附上源码地址:

https://github.com/mvpdream/vueDemo

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

推荐阅读更多精彩内容

  • 安装 npm npm install vuex --save 在一个模块化的打包系统中,您必须显式地通过Vue.u...
    萧玄辞阅读 2,901评论 0 7
  • VUE Vue :数据驱动的M V Vm框架 m :model(后台提供数据),v :view(页面),vM(模板...
    wudongyu阅读 5,298评论 0 11
  • vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
    sunny519111阅读 7,971评论 4 111
  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,855评论 1 4
  • 20180317(52/60) 【幸福实修目标】觉知去感悟每时每事每人,带着过去,立足于现在,朝向未来,我可以做些...
    你谢谢阅读 422评论 0 0