在 Vue 中有 v-html 这个便利的指令,可以让我们直接输出 HTML,但它有个缺点。
Vue 官网这样解释这个「指令」
双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用 v-html 指令:
Using mustaches: {{ rawHtml }}
Using v-html directive:
输出代码:
Using mustaches:
This should be red.
Using v-html directive: This should be red.
这个 span 的内容将会被替换成为属性值 rawHtml,直接作为 HTML——会忽略解析属性值中的数据绑定。注意,你不能使用 v-html 来复合局部模板,因为 Vue 不是基于字符串的模板引擎。反之,对于用户界面 (UI),组件更适合作为可重用和可组合的基本单位。
你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值。
什么是 XSS 攻击?
XSS是跨站脚本攻击(Cross-Site Scripting)的简称。
XSS是一种注入脚本式攻击,攻击者利用如提交表单、发布评论等方式将事先准备好的恶意脚本注入到那些良性可信的网站中。
当其他用户进入该网站后,脚本就在用户不知情的情况下偷偷地执行了,这样的脚本可能会窃取用户的信息、修改页面内容、或者伪造用户执行其他操作等等,后果不可估量。
发送到Web浏览器的恶意内容通常采用JavaScript代码片段的形式,但也可能包括HTML,Flash或浏览器可能执行的任何其他类型的代码。
componted 有缓存, data不变则不会重新计算
watch如何深度监听?watch是浅监听(基础数据类型)
watch监听引用类型,拿不到oldval。不能深度监听,要加deep:true才能深度监听,监听对象元素的变化
computed监听v-model中的值,必须要有get()和set()
区别
computed
1. 支持缓存,只有依赖数据发生改变,才会重新进行计算
2. 不支持异步,当computed内有异步操作时无效,无法监听数据的变化
3.computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过或者父组件传递的props中的数据通过计算得到的值
4. 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed
5.如果computed属性属性值是函数,那么默认会走get方法;函数的返回值就是属性的属性值;在computed中的,属性都有一个get和一个set方法,当数据变化时,调用set方法。
watch
侦听属性watch:
1. 不支持缓存,数据变,直接会触发相应的操作;
2.watch支持异步;
3.监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;
4. 当一个属性发生变化时,需要执行对应的操作;一对多;
5. 监听数据必须是data中声明过或者父组件传递过来的props中的数据,当数据变化时,触发其他操作,函数有两个参数,
immediate:组件加载立即触发回调函数执行,
deep: 深度监听,为了发现对象内部值的变化,复杂类型的数据时使用,例如数组中的对象内容的改变,注意监听数组的变动不需要这么做。注意:deep无法监听到数组的变动和对象的新增,参考vue数组变异,只有以响应式的方式触发才会被监听到。
监听的对象也可以写成字符串的形式
"obj.name"
当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。这是和computed最大的区别,请勿滥用。
var vm = new Vue( {
el: '#app',
data: {
childrens: {
name: '小强',
age: 20,
sex: '男'
},
tdArray:["1","2"],
lastName:"张三"
},
watch:{
childrens:{
handler:function(val,oldval){
console.log(val.name)
},
deep:true//对象内部的属性监听,也叫深度监听
},
'childrens.name':function(val,oldval){
console.log(val+"aaa")
},//键路径必须加上引号
lastName:function(val,oldval){
console.log(this.lastName)
}
},//以V-model绑定数据时使用的数据变化监测
} );
watch: {
// 普通监听
name(oldVal, val){
console.log(oldVal)
},
info: {
// 监听引用类型必须使用 handler 函数
handler(oldVal, val){
// 引用类型监听不到 oldval的,因为指针已经只像了相同的值
console.log(oldVal)
},
deep: true // 深度监听
}
}
1.手段:v-if是动态的向DOM树内添加或者删除DOM元素;v-show是通过设置DOM元素的display样式属性控制显隐;
2.编译过程:v-if切换
有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;v-show只是简单的基于css切换;
3.编译条件:v-if是惰性的,如果初始条件为假,则什么也不做;只有在条件第一次变为真时才开始局部编译(编译被缓存?编译被缓存后,然后再切换的时候进行局部卸载); v-show是在任何条件下(首次条件是否为真)都被编译,然后被缓存,而且DOM元素保留;
4.性能消耗:v-if有更高的切换消耗;v-show有更高的初始渲染消耗;
5.使用场景:v-if适合运营条件不大可能改变;v-show适合频繁切换。
二、V-show和v-if的区别?
V-show有较高的渲染成本,
V-if有较高的切换成本。
V-if是真正的条件渲染,确保切换过程中条件内的事件监听器和子组件适当的被销毁和重建。
V-show的元素始终被渲染并保存在dom中,操作的只是display属性控制演示影藏。
遍历对象
v-for="(value, key, index) in obj"
key的重要性, key不能乱写(random, index)
v-for 和 v-if 不建议一起使用(v-for的层级更高)
ul和li搭配使用,或者是渲染父级标签下的子标签,可以使用如下方法:
2>可以使用过滤器将v-if中的判断转移到vue的computed的计算属性中,方法如下:
//利用vue的计算属性,过滤掉不需要的数据,剩下需要的数据再利用v-for循环遍历取出渲染
computed: {
formList: function () {
return this.list.filter(function (item) {
return item.state
})
}
}
必须用key, 且不能是index和random
diff算法中是通过tag和key来判断,是否为sameNode
减少渲染次数,提升渲染性能
@click='onhandle'
onhandle(e){
console.log(e) //e是原生的事件对象
}
事件被挂载到当前元素
组件之间如何进行通信的
props, this.$emit
自定义事件(兄弟组件)
const event = new Vue()
event.$emit('handle', 参数)
其他组件
event.$on('handle', this.handle)
最后,必须注销该事件,在beforeDestroy
event.$off('handle', 指定上面的函数)
// 阻止单击事件继续传播
<a v-on:click.stop='doThis'>a>
//提交事件不再重载页面
<form v-on:submit.prevent='onSubmit'>
form>
// 修饰符可以串联
<a v-on:click.stop.prevent=''>a>
// 只有修饰符
<form v-on:submit.prevent>
form>
// 添加事件监听器时使用事件捕获模式
// 即内部元素触发的事件(内部还有click事件)先在此处理,然后才交由内部元素进行处理
<div v-on:click.capture=''>
div>
// 只当event.target是当前元素自身时触发处理函数
// 即事件不是从内部元素触发的
<div v-on:click.self=''>
div>
// 即alt, shift被一同按下时会触发
<button @click.ctrl=''>button>
// 有且只有ctrl被按下的时候触发
<button @click.ctrl.exact=''>button>
// 没有任何系统修饰符被按下的时候才触发
v-model
常见表单项 textarea checkbox redio select(下拉列表)
修饰符 lazy number trim
// 输完内容相应的数据才会变
// 去除输入内容的前后空格
// 输入内容必须是数字
复选框
v-model绑定的是一个数组
选中那个选框, 那个选框的value就会添加到数组中
单选框
v-model绑定的是一个字符串
选中那个选框, 那个选框的value就会改变字符串
https://segmentfault.com/a/1190000011381906
render函数选项 > template选项 > outer HTML.
在beforeUpdate,可以监听到data的变化但是view层没有被重新渲染,view层的数据没有变化。等到updated的时候 view层才被重新渲染,数据更新。
{{message + '这是在outer HTML中的'}}