声明式渲染是初接触vue所最被震撼的,似乎这就是vue的所有,但果真如此吗?
//
声明式渲染意为用简洁的 模板语法 来声明式地将数据渲染进dom
//
然后是指令,什么是指令呢?vue的指令会绑定一个表达式 并将特性应用到DOM上
这里两个比较常用的有v-on,用于监听dom事件,v-bind,用于响应式地更新HTML属性
指令还有修饰符
v-bind用于响应式地更新html属性,比较特殊的语法有class的动态绑定,
//
{
/****/
}
这样的形式就是一个对象
//
class的active 和ss是否存在取决于isActive 和isSSS的布尔值。
绑定的数据对象不必内联定义在模板里,可以用
data: {
classObject: {
active: true,
ss: false
}
} 代替
//
这种语法,其实仔细想想,替换后是一样的,isActive,isSSS都替换成了相应的data中的数据,和这种直接以对象(属性,值对)形式赋值完全是等价的
(这里,思维提炼下是 上面那种形式 等价于 data中的一个数据项 , 这个数据项是一个对象,即上面那种形式就是对象)
//
以上是对象语法,数组语法可以这样写
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
修饰符 用于指出一个指令应该以特殊方式绑定(特殊处理方式)
prevent stop 并不理解具体会怎样~~
生命周期钩子
计算属性
模板语法有一定的运算能力,但运算复杂之后会导致可读性降低,所以此时要用到计算属性。
计算属性的特色是什么呢?虽然它是一个表达式,但由于它的缓存性质,其实可以把它看做一个值。
解释如下,计算一个表达式,即 y=x*z,y的值(即计算属性的值)是依赖于x和z的,在第一次计算之后,如果它的依赖,即x和z不变的话,那么它就不需要重新计算,直接返回值了。所以这叫计算属性的依赖,所以说计算属性就是可以看做一个值。
侦听属性
当某数据发生变化时,可以设置为此采取的动作
var vm = new Vue({
el: '#demo',
data: {
datatowatch: 'Foo'
},
watch: {
datatowatch: function (val) {
// do something for the data change
}
}
})
vue具有可复用的特性,即 如果Html元素可以被重复使用,不会销毁他去新建新的dom元素,如
在两种登录模式中,所用的input其实是同一个,不会因切换登录模式而改变
当然,有时这种特性不是我们需要的,此时我们只需添加一个key属性就可以了
vue数组操作的注意事项
由于 JavaScript 的限制,Vue 不能检测以下变动的数组:
当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
当你修改数组的长度时,例如:vm.items.length = newLength
为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将触发状态更新:
// Vue.set
Vue.set(example1.items, indexOfItem, newValue)
为了解决第二类问题,你可以使用 splice:
example1.items.splice(newLength)
还是由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除:
var vm = new Vue({
data: {
a: 1
}
})
// `vm.a` 现在是响应式的
vm.b = 2
// `vm.b` 不是响应式的
对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性。例如,对于:
var vm = new Vue({
data: {
userProfile: {
name: 'Anika'
}
}
})
你可以添加一个新的 age 属性到嵌套的 userProfile 对象:
Vue.set(vm.userProfile, 'age', 27)
你还可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名:
vm.$set(vm.userProfile, 'age', 27)
组件组合
每个组件实例的作用域是孤立的,
//
什么是作用域?我猜测是变量的生存空间,离开这个空间,变量就失效了。
父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译。《===这个是一定的,不变的,绝对的
这个作用域可以理解为new Vue({
//这部分就是这个Vue的作用域
//
})
//
那么组件件的数据交互是通过另外方式进行的
总的来说是
prop 向下传递,事件(emit event)向上传递
子组件显式声明props,然后父组件调用的时候直接传递参数就可以了
动态prop要用v-bind来绑定
事件接口
每个 Vue 实例都实现了事件接口,即:
使用 $on(eventName) 监听事件
使用 $emit(eventName) 触发事件
//
不能用 $on 监听子组件释放的事件,而必须在模板里直接用 v-on 绑定
这句话的意思是emit 和 on 必须在同一个(级)组件中?
反正听他的话,父子组件用v-on监听把。
//
v-on绑定的语法是
v-on:(释放的事件名)="(处理事件的函数名)"
编译作用域
// 让我们来看这段
大雾
一个常见错误是试图在父组件模板内将一个指令绑定到子组件的属性/方法:
假定 someChildProperty 是子组件的属性,上例不会如预期那样工作。父组件模板并不感知子组件的状态。
如果要绑定子组件作用域内的指令到一个组件的根节点,你应当在子组件自己的模板里做:
Vue.component('child-component', {
// 有效,因为是在正确的作用域内
template: '
Child
',
data: function () {
return {
someChildProperty: true
}
}
})
上面这种形式有效我可以理解,在根组件中定义了它
但是所有组件不都是这样注册的吗?如果是说单页面组件我尚能理解,但这后面好像还有别的东西
理解错了,没好好读,它的意思是在这个组件内部声明了,看那个tmplate
这段要阐明的就是说,每个模板的内容都在自己组件的作用域中进行编译。
////
插槽
用于组合父组件和子组件的内容
譬如 一台电脑,它有各种硬件接口,我们使用它(组件),但是我们还想在它里面加点东西,那我们就在它的接口上插上去,这样就把东西加在我们想加的地方了,并且不会覆盖电脑的其他东西。
以下是一个插槽的实例:
//
假定 my-component 组件有如下模板:
我是子组件的标题
只有在没有要分发的内容时才会显示。
父组件模板:
我是父组件的标题
这是一些初始内容
这是更多的初始内容
渲染结果:
我是父组件的标题
我是子组件的标题
这是一些初始内容
这是更多的初始内容
//
当有多段插入元素时,我们可能不想简单的插入一大段,怎么方便的使用插槽呢?
所以除了普通插槽还有具名插槽(有name属性的插槽)
示例如下
//
例如,假定我们有一个 app-layout 组件,它的模板为:
父组件模板:
这里可能是一个页面标题
主要内容的一个段落。
另一个主要段落。
这里有一些联系信息
渲染结果为:
这里可能是一个页面标题
主要内容的一个段落。
另一个主要段落。
这里有一些联系信息
在设计组合使用的组件时,内容分发 API 是非常有用的机制。
//分发即
父组件将内容穿插到子组件中,意即分发
//
还有 作用域插槽
作用域插槽是一种特殊类型的插槽,用作一个 (能被传递数据的) 可重用模板,来代替已经渲染好的元素。
我的理解是:用于向父组件传递数据
//
在子组件中,只需将数据传递到插槽,就像你将 prop 传递给组件一样:
//把要传递给父组件的数据写在这里
在父级中,具有特殊特性 slot-scope 的