vue2.0

vue 2.0

渐进式框架

MVC 单向通信

> m:model 数据层 保存数据

> v:view视图层  用户界面

> c:controller 控制器 业务逻辑

> 用户操作界面,通过DOM事件,向控制器发送指令, 执行相应业务逻辑 通知数据层保存或修改状态,在由数据层反馈给视图层;

view(视图层)-->controller(控制器)-->model(数据层)-->vive(返回给视图层)

angular 是单项数据绑定 mvc

mvvm 双向数据绑定

>m:model数据层 保存数据

>v:view视图层  用户界面

>vm:viewModel视图模型

双向绑定

>view(视图层)-->viewModel(视图模型)-->model(数据源)

>1:view(视图层)改变了,viewModel(视图模型)也会改变,model数据源跟着会更新

>2:model数据更新了,也会通知viewModel(视图模型)改变,view(视图层)会跟着改变

vive是双向数据绑定

vue初始化实例

> 初始化一个Vue根实例

> 他需要一个参数对象options

> el挂载元素--他不能挂载在body上面

> data数据(viewModel) 方法 生命周期钩子 template(模板)

>

{{title}}

varvm=newVue({

el:'#app',

data:{

title:'hello ni hao'

}

})

> vue根实例  vm代理data

> vm.title; 得到'hello ni hao'

vue 压缩和不压缩

> 通常开发阶段 引入不压缩版 报错提示便于调试

> 压缩版 vue.min.js是没有报错提示的(开发阶段用這个)

根实例前面带

一个页面,我们通常只生成一个实例

//1:生成一个vue根实例,并传入一个参数对象

varobj={

title:'动态',

say:''

}

varvm=newVue({

el:'#app',

data:obj

})

//vm根实例 会暴露出属性和方法 前面带$

console.log(vm.$data);

console.log(vm.$el);

obj.title='bhhhsuj';//可以修改实例

obj.say='jjsj';//不能在实例生成后再添加属性

vm.$mount('#app');手动挂载元素

$watch

vm.$watch('title',function(newVal,oldVal){

/*

*@par:newVal新添加的值

*@par:oldVal 旧值

* */

console.log(newVal, oldVal);

});

setTimeout(function(){

vm.title='nnn'

},3000)

模板语法

{{}}

> 1:{{text}} 薄伟玲  可以看到编译前的样子,后面的内容也能显示(可以看到在里面添加的文本)

> 2:不识别html标签

> 3:v-cloak  [v-cloak]{ displat:none} 编译前就是一个普通的属性选择器

避免闪烁也可以使用{{}}来插入值

> 4:可以走三元运算/content=content||'没有值'

> 5:可以进行简单的运算

> 6:可以进行转换大小写

> 7:v-once="";一次性插入 插入以后不能在修改了

v-xxx=’xxx’

>1:v-text='text'  薄伟玲  避免了闪烁  避免看不到编译前的样子 看不到添加的文本,覆盖了

>2:v-text='text' 可以识别html标签 尽量少用 避免xss攻击

>

插入动态属性v-bind

插入动态属性v-bind

{{linkText}}

data:{ link:'www.baidu.com',

linkText:百度

}

缩写:

{{linkText}}

v-bind:style

:--> v-bind:的缩写

> :style="{width:'100px',height:'100px',background:'red'}"

> v-bind:style="styleObj"

>

v-bind:sclass

动态绑定class

v-bind:class=''

> 与静态class是共存的

> 对象写法 样式名 booleantrue添加false不添加

> 数组写法 [s1,s2]

v-if 判断指令

v-if=“true”;

插入和移除的作用,操作的是DOM

true是插入显示操作

false是移除不显示操作

v-show true显示/false隐藏

v-for

要循环谁 就把 v-for写在谁身上

{{key}} : {{val}}

-->

nameis{{result.name}}  ageis{{result.age}}

v-model

文本框的内容改变 P标签的内容也改变

{{name}}

应用于表单中双向数据绑定 文本框 radio checkbox select textarea

双向绑定 数据改变 视图也改变 视图改变 数据也改变

methods事件集合

v-on绑定事件 click 事件类型say处理函数

> v-on:click="say"缩写 @click="say"

>say()不传参的话默认事件对象

> $event 特殊变量 代表的是事件对象

new Vue({

el:'#app',

data:obj,

methods:{

say:function(e,event){ 存放事件方法 集合

this-->当前的vue根实例

event-->$event 事件对象

}

}

})

filter只要不是当前這一项,其他的都返回出去

v-on 事件修饰符

> v-on:click.parevent阻止默认事件,执行事件不跳转(a标签先执行事件,不跳转)

> v-on:click.stop阻止冒泡传播 修饰符 事件类型  (给谁阻止默认行为,就给他這个stop)

> 修饰符可以串联写法 v-on:click.parevent.stop

> v-on:click.capture捕获阶段capture 从外到内

> v-on:click.one只触发一次点击事件

> v-on:submit.prevent阻止表单的默认行为

按键修饰符

> v-on:[email protected]按下回车键触发 (v-on:[email protected])

> @keyup.space空格

> @keyup.escesc 其他的键码不好使

> @keyup.delete按下删除的键的delete

> @keyup.tab按tab

> @keyup.up上

> @keyup.down下

> @keyup.left左

> @keyup.right右

computed 计算属性

计算属性是默认getter方法

页面一打开的时候,就执行了。 只能在组件里面

computed 通过一个属性 计算出来一个新的属性 当這个属性变化时,新的属性也会跟着变化

varvm = new Vue({

el:'#app',

data:{price:100,count:10,name:'飞机'},

computed:{

//sum属性由两部分组成 (获取,设置)

sum:{

get(){//展示就是获取

//如果price和count变化会导致 sum变化

returnthis.price *this.count;

},

set(val){//赋值就是设置 vm.sum = 100;

//sum变化有可能会改变name变化,computed属性中this依然是vm

this.name =val;

}

}

/*sum() {

return this.price * this.count;

}*/

}

});

watch监听

newVue({

el:'#app',

data:{

val:''

},

watch:{//监听

val(newVal,oldVal){//新值 旧值

console.log(newVal,oldVal)

}

}

});

生命周期钩子函数

- 生命周期钩子函数

letvm=newVue({

el:'#app',

data:{

title:'hello vue.js'

},

beforeCreate(){

alert('实例创建前')

},

created(){

alert('实例创建后')

},

//准备挂载数据

beforeMount(){

alert('数据元素挂载前')

},

mounted(){

alert('数据元素挂载后')

},

//销毁组件的

beforeDestroy(){

alert('销毁前')

},

destroyed(){

alert('销毁后')

},

//数据更新

beforeUpdate(){

alert('更新数据状态')

},

updated(){

alert('更新完成')

}

})

过滤器

1.0有过滤器2.0只能自己定义过滤器

> {{message | uppercase}}

//自定义过滤器

Vue.filter('uppercase',function(){

return arguments[0].toUpperCase();

});

letvm=new Vue({

el:'#app',

data:{

message:'hello word'

}

});

> currency货币过滤器

{{100| currency:'£'}}

> lowercase & uppercase大小写转换过滤器

{{'abc'| uppercase }}

{{'ABC'| lowercase }}

> limitTo限制位数

{{123456| limitTo:5}}

> number数字过滤器

{{1234.2345|number:2}}

> json对象过滤器

 
 

{{{aa:123,bb:456} | json}}

> date日期过滤器

{{1654325689063| date:'yyyy-MM-dd hh:mm:ss'}}

> orderBy排序orderBy:'字段名字':'正反序'(true/false)

{{p.name}}

//$emit发射器

//子组件 需要借助 this.$emit发布相应自定义事件

//父组件 需要在子组件 身上 通过 v-on:自定义事件类型 = 事件处理器, 进行监听 并处理

vue组件

组件可以多级嵌套

全局组件

组件是一个vue强大的功能 扩展html元素 代码重复利用

> 全局组件 在初始化实例之前,注册全局组件

> 参数:

> 1:@param1组件名 多个单词my-compoent 也可以是单个单词 comp

> 2:@param2参数对象 配置 组件 结构(template) 行为(methods) 数据(data).....

> 注意:

> 1:组件data必须是一个函数 返回return 一个对象 data里面存放的是返回页面的数据 title這一类的变量

> 2:组件名不能使用div h3 这些已经存在的标签 要用自定义的标签

> 3:在结构template模板里面,只能有一个根元素,例如一个div套着一个标签,不能有两个div

> 4:可以用多个实例,

> Vue.component('my-compoent组件名');

局部组件

> 局部组件

- 注意:一个单词的话:child就可以了  多个单词用字符串包起来'my-comp1';

newVue({

el:'#app1',

components:{//局部注册组件

'my-comp1':{

template:'

my-comp1

'

},

child:{

template:'

child

'

}

}

});

data

> 组件的data是一个函数

> 每创建一个组件 返回一个新的属于当前组件组件私有data对象

components: {

child: {

template: '

{{val}}

',

data() {  组件的data是一个函数

return{val: 'hello'}; // 每创建一个组件 返回一个新的属于当前组件组件私有data对象

}

}

父子组件props

> 父子组件通信  通过props 接收外部 传递进来的数据

> 子组件 不可以 直接使用 父组件的 数据

> props 用来 从父组件 传递数据 给子组件

> props 单向数据流  父组件 传递给 子组件数据 父组件 修改了 子组件也跟着修改,但是 子组件不能修改父组件  提示 警告

>

>从子组件外部传递数据 mess='liwenli' 这样的传递都是string

>如果想传递 动态属性 需要 v-bind

let child = {

props: ['myMess','say'],

> 指定 用来接收 传递进来的的数据属性 如果属性名是驼峰命名myMess

> 在 外部使用的时候 全小写 '-' 隔开

> template: '

{{say}}{{myMess}}

',

template: '

{{say}}{{myMess}}

',

};

new Vue({

el: '#app',

data: {

title: 'parentData'

},

components: {

child

}

});

$emit 发射器

> 子组件 需要借助 this.$emit 发布相应自定义事件

> 父组件 需要在子组件 身上 通过 v-on:自定义事件类型 = 事件处理器, 进行监听 并处理

> 接收子组件的通知 并触发 listen(父组件中的定义的处理函数)


子组件传递过来的数据:{{mess}}

newVue({

el:'#app',

data: {

mess:'等待接收'

},

methods: {

listen(val){

console.log(val);// 接收到 子组件的msg

this.mess = val;

alert('收到子组件通知');

}

},

components: {// 定义一个子组件

child: {

template:'

子组件发布

',

data(){

return{msg:'我是子组件传递过来的数据'}

},

methods: {

say(){

alert('子组件进行发布');

//    liwenli 自定义事件类型

//      this.msg要传给父组件的数据 在发布的时候以参数的 形式传递过去

this.$emit('liwenli',this.msg);// 发布自定义事件

}

}

}

}

});

slot 分放内容 分配位置

> 想把里面的内容插入到文字的前面或者后面,直接把這个标签放进去就行了。放在前面或者后面或者给他起名字,插入到前面后面

>

头部信息

标题

底部信息

new Vue({

el: '#app',

components: {

child: {

//    template: '

这是一个主体内容

'

//      具名 slot

template: `

这是一个主体内容

`

}

}

});

is 指定模板插入位置

- keep-alive 缓存组件状态,修改以后,会保存上次修改的内容 必秒重新渲染加载了

-is需要一个component這个标签来嵌入模板,需要把哪个模板引入进去,那就写上他的组件名就行了

users:

books:

--------------->

newVue({

el:"#app",

data:{

comp:'users'

},

components:{

users:{

template:'

',

data(){

return{

val:'users components'

}

}

},

books:{

template:'

',

data(){

return{

val:'books components'

}

}

}

}

})

vue 过渡效果

> name-enter 指定进入过渡开始状态

> name-enter-active 指定进入过渡激活结束状态

> name-leave 指定离开过渡开始状态

> name-leave-active 指定离开过渡激活结束状态

显示/隐藏

// v-show

// 组件切换

newVue({

el:'#app',

data: {

flag:false,

styleObj: {

width:'100px',

height:'100px',

backgroundColor:'red'

}

}

});

animated


我是 animate.css

vue路由 vue-router

> spa单页应用 在一个页面中,切换导航展示响应内容,局部刷新不需要跳转 重新加载整个页面

> 前端路由 在一个页面切换多个页面

导航必须這么写

- router-link是路由标签,他代表页面中的a标签

- to 后面的是路由路径

- router-view他是一个占位符,会把路由标签解析程a标签 必须要写

- keep-alive 避免重复加载,第一次填写的内容,他可以历史记录出来

首页

路由步骤

1.创建组件

let Index = {

template:'

这是首页

'

};

2.配置路由规则 路由路径 映射 组件

let routes = [

{path:'/index',component:Index},

{path:'*',redirect:'/index'} 默认路由

];

3.创建路由实例

let router=newVueRouter({routes:routes});

4.根实例中注入路由router:创建的路由实例 (newVueRouter({routes}))

newVue({

el:'#app',

router:router

})

动态路由

>1:route.params.key 用来获取路径参数-id也可以是name- 获取问号后面的查询参数

>2:全局钩子函数 每次切换之前都会触发,要做权限认证

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

-to要到哪个路由

- from 从哪个路由开始

-next控制是否继续 也可以传递参数 必须写next

>3:局部的可以写在局部组件里面

letIndex = {

template:'

这是首页

',

beforeEach(to,from,next){ 当你切换到当前路由之前触发

}

};

>4:this.$router.push('/')切换到指定路由 记录history

>5:this.$router.replace('/')替换路径 不会记录history 两个效果一样

>6:this.$router.go()-1就是回到上一个页面 -2参数就是回到上两个页面 后退

> this.$router.back(1)back是后退 传的是正值

>7:watch(){ 监听

}

vue单文件组件

(vue-clivue脚手架)

> 自定义后缀是.vue文件,一个文件就是一个组件(功能 结构 样式 数据状态)

> 如果想使用vue单文件组件,需要借助编译工具 比如webpack browserify 编译程可以识别的

> vue-cli (vue脚手架):将基本环境搭建好,然后我们基于這个环境开发

> npm install vue-cli -g

> vue list 安装之后,需要下载哪些列表

> 安装完以后,可以使用vue命令

-vue init   模板名字 项目名字  初始化一个项目

-模板类型:

-webpack - A

-webpack-simple - A

-browserify - A

-browserify-simple - A

-simple

下载之后,做這几步骤

> 1:cd 项目名myvue  进入项目

> 2:安装依赖 npm install

> 3:开启server 阅览 npm run dev 這个server是webpalk帮我们搭建的

import

importVuefrom'vue'在js里面导入vue

初始化

vue init webpack-simple myvue2

cd myvue2

npm install

npmrundev

你可能感兴趣的:(vue2.0)