[TOC]
Vue.js安装
- 下载到本地, 在项目文件中直接引入
- NPM安装
Vue的渐进式
简单使用
在项目中引入
<script type="text/javascript" src="js/vue.js"></script>
建立基本元素
v-for
进行循环遍历显示- 当代码加载到这一个代码块,还未执行第三个代码块时,页面上显示的还是原有东西
{{message}}
,只有当它加载了Vue对象,就会把页面当中的东西替换掉。<div id="app">{{message}} <div>{{s1}}</div> <ul> <!-- 遍历movies 创建li 写入数据 --> <li v-for="item in movies">{{item}}</li> </ul> </div>
建立Vue对象,传入一个对象参数,绑定元素
- 创建Vue时,options可以放 el data methods 生命周期函数等
原始JS将数据动态写入标签时,需要 获取元素、定义值、将值放入元素,这种方式叫做const app = new Vue({ el: '#app', // 用于挂在要管理的元素 data: { // 定义数据 message:'kon ni chi wa', s1: 'kon ban wa', movies: ['星际穿越', '教父', '大鱼', '哈利波特'] } });
命令式编程
VUE的这种赋值方式叫做声明式编程
,将数据与页面分离
若data中的数据值发生改变时,页面上显示的数据也会自动跟着改变 —**响应式**
- 创建Vue时,options可以放 el data methods 生命周期函数等
- 但有些改变不会产生响应式,有些方法可以
- 对数组
this.names[0] = 'ldf'
,页面上的内容不跟随改变 新版好像可以 - 可以产生响应式的方法有:
push()
在尾部添加pop()
弹出并删除最后一个元素shift()
删除数组中的第一个元素unshift()
在头部添加splice()
删除、插入元素array.splice(start, end[, str])
end为 0 时就不删除元素sort()
排序reverse()
颠倒 反转Vue.set(array, 下标, 值)
生命周期
图:
图中,绿色的是内部实现的;红色的是钩子,交由用户实现的
常用生命周期函数:created()
创建(组件)后destroyed()
销毁后。一般情况时,从一个组件跳转到另一个组件中时,前者即被销毁,除非使用了 keep-livemounted()
挂载后activated()
组件被激活后
插值 Mustache语法
- 即
{{message}}
,又称双大括号语法- 只有当该内容出现在被管理的范围内时,才会被解析出来
- 只能直接使用在首尾标签的内部
- 当头标签里面的属性要用到 data 中的数据时,需要 v-bind
- 响应式,当数据更改时 页面上的内容也会立刻变化
- 若元素加上
v-once
指令,则不能被再次改变值
- 若元素加上
v-html
指令的使用,将字符串中的html标签解析出来<div id="contain"> <h3 v-html="data_url"></h3> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> const app = new Vue({ el: '#contain', data: { data_url: '<a href="http://www.biying.com">必应</a>' } }) </script>
在双大括号中可以使用简单的表达式
- 比如:
{{message + text}}
,{{count * 2}}
- 比如:
v-pre
指令,将标签内的双大括号以原始样子 {{}} 显示v-cloak
指令。在某个标签中加上该指令,可以用来控制解析之前标签的显示与否等- 在vue解析之前,标签中的该指令存在
- 在vue解析之后,标签中的该指令消失
语法
动态绑定属性 v-bind
v-bind
指令,用来动态绑定标签中的各种属性值 ```html
中村桑
Vue view
```
4. 动态绑定style属性的值,`v-bind:style=""` `:style=""`
1. 以对象或数组形式
```html
动态绑定style1
动态绑定style2
{{counter}}
// 这个 counter 就是下面data中的数据。counter++ 相当于一个表达式
morning~
afternoon
morning~
afternoon
55
``` - 用户切换的小案例 - label的for属性使其能够自动聚焦对应的输入框 ```html- {{index+1}}.{{item}}
- {{key}}-{{value}}
{{message}}
等同于:
```
- v-mode 结合 radio
```html
选择性别:{{sex}}
```
- v-model 结合 checkbox,自动获取所选内容
- 单选时,值为布尔类型
- 多选时,为具体内容
```html
您选择的是: {{isAgree}}
篮球
排球
足球
游泳
```
- v-model 与 select,也支持单选与多选(multiple)
- 值绑定,将用户要选择的选项从服务器获取,动态展示到页面中
- **修饰符**
- `v-model.lazy=''` input失去焦点或敲回车时 再进行变量更新
- `v-model.number=''` 根据data中关联的元素内容 可以限定输入数字,且不会把输入的数字自动转为字符串
- `v-model.trim=''` 自动去掉字符串左右的空格
## mixin 混入
将组件的内容提取出去,导入后 `mixins: [对象名]`,作用是可以将一些重复的代码提取出去。所选:{{hobbies}}
也可以将导入的内容与原来的内容合并。 ```javascript export const mixinListener = { mounted() { console.log('This is a mixin part'); }, } ``` ```javascript import { mixinListener } from "@/common/mixin.js" export default { ... mixins: [mixinListener], mounted() { ... } } ``` # 计算属性 computed 1. 作用,将data中的属性处理之后再直接使用 1. 实质上是一个属性,使用时不用加`()` 1. 计算属性在多次使用时只执行一次 **有缓存,**当再次执行的内容与前一次完全一致时 不会再执行该函数;而methods调用多少次就执行多少次 没有缓存 ```html
计算属性 {{fullName}}
```
## get set
计算属性有get 和set方法,但是一般只写get方法(只读属性)
- 因此可以看出,计算属性里面的元素本身并不是函数
```javascript
computed:{
car: {
get: function(){
return content;
}
}
}
// 省略如下
computed:{
car: function(){
return content;
}
}
```
# 组件 component
基本步骤:
1. 创建组件构造器,调用`Vue.extend()`方法
1. 传入template模板
2. 注册组件。调用`Vue.component()`方法
1. 标签名,组件构造器
1. 下面例子为注册**全局组件**,可以在多个Vue的实例中使用
3. 使用组件,在Vue实例的作用范围内使用
```html
内容
`
});
// 或
const app = new Vue({
el: '#app',
components: {
cpn2: {
template: `内容
`
}
}
});
```
**分离组件模板**
1. 使用`script`标签
```html
template 抽离模板
 - 在使用组件的时候,在组件标签中 通过`**v-bind**`将父组件的数据绑定给对应的元素 - 在定义组件时,通过`**props**`属性 声明需要的变量名称及其类型及相关约束 - 当类型为`Array Object`时,设置的默认值必须通过一个函数返回 - 可以自定义验证类型 - 默认有的数据类型: - String、Number、Boolean、Array、Object、Date、Function、Symbol ```html
{{thedays}}
{{cmessage}}, {{cmovies}}, {{theFinalMessage}}
// 子组件绑定自己的方法
```
## watch 属性
监听data的数据变化,就不必写`@input=''`
- 方法名称必须与要监听的数据名称一致
```html
```
## 父子组件的访问方式
1. 父组件访问子组件,使用 $children 或 $refs
- $children 返回数组,包含所有子组件
- 常用**$refs**,需要在使用子组件时,给子组件添加一个属性值`ref='特定值'`,
```html
若组件的模板中没有使用 slot ,那么在使用组件的起止标签之间的任何内容都会被抛弃。
把相同的东西放在原组件中,不同的东西留成插槽 - 一个空的slot,会把组件标签内部的内容全部替换到插槽位置 ```html
组件内容
组件内容
使用组件时,给要替换的内容用 `template` 标签包住,并使用`v-slot:名字` 指定要替换哪一个 slot,若要替换的slot没有写name值,则`v-slot=default` .
注意,**v-slot **只能添加在** **上,一种情况除外 ```html
只有在组件模板内使用的data变量才在组件定义中查找 **作用域插槽**
父组件替换插槽的标签,但是内容由子组件提供
通过插槽把子组件的数据传给父组件,再在使用子组件时,拿到该数据,以必要的形式展示数据 - cpn4标签中的`template`也可以用其他标签 - `v-slot:default='slot'` 定义插槽对象的名字 可任取,通过这个对象获取传来的数据 `slot.data` - 此 default 指的是默认插槽,即没有给定name的插槽 - slot标签中的`:data='cLan'`指定要传过去的数据,两处的 data 需一致 也可以是其他字符串 ```html
- {{item}}
当提供内容的只有默认插槽时,就可以把 v-slot 放在组件标签上,并可以简写未 `v-slot='一个名字'`。
简写的 v-slot 不能与具名插槽混用,须得写上名字或 default 。 `v-slot:` 可以简写为 `#`,即 `v-slot:right` --> `#right`
注意:任何简写、语法糖,都只能在有参数的情况下,需要是 `#default=''`,而不能是 `#=''`。 # 模块化 就是使用ES6或者Nodejs的语法...... # webpack ## 在Vue项目中使用webpack **SPA** simple page web application 单页面 复应用 > 在项目中使用了模块化、webpack之后,通过import的方式引入Vue,而不再是通过