Vue 常用属性三种模板 总结
Posted YuLong~W
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue 常用属性三种模板 总结相关的知识,希望对你有一定的参考价值。
文章目录
常用属性
el
el有2种写法:
- new Vue时候配置el属性
- 先创建Vue实例,随后再通过
vm.$mount('#root')
指定el的值
const v = new Vue(
el:'#root', //第一种写法
data:
name:'呜啦啦'
)
//v.$mount('#root') //第二种写法
data
data有2种写法:
- 对象式
- 函数式
注意:组件时,data必须使用函数式,否则会报错
new Vue(
el:'#root',
//data的第一种写法:对象式
/* data:
name:'呜啦啦'
*/
//data的第二种写法:函数式
data()
console.log(,this) //此处的this是Vue实例对象
return
name:'啦啦啦'
)
methods
通过methods属性定义方法,放置页面中的业务逻辑,js方法一般都放置在methods中
用methods实现姓名案例:
<body>
<div id="root">
姓:<input type="text" v-model="firstName"> <br/><br/>
名:<input type="text" v-model="lastName"> <br/><br/>
全名:<span>fullName()</span>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
new Vue(
el:'#root',
data:
firstName:'张',
lastName:'三'
,
methods:
fullName()
console.log('@---fullName')
return this.firstName + '-' + this.lastName
,
)
</script>
computed
计算属性:指的是通过一系列运算之后,最终得到一个属性值。这个动态计算出来的属性值可以被模板结构或 methods 方法使用。
计算属性在声明的时候被定义为方法,但是计算属性的本质是一个属性
原理: 底层借助了Objcet.defineproperty
方法提供的 getter 和 setter
每一个计算属性都包含一个getter(get) 和一个setter(set) ,大多数情况用计算属性的默认用法, 只是利用了getter 来读取。在需要时,也可以提供一个setter 函数, 当手动修改计算属性的值就像修改一个普通数据那样时,就会触发setter 函数,执行一些自定义的操作。
计算属性缓存:
计算属性是基于它们的依赖进行缓存的,计算属性只有在它的相关依赖发生改变时才会重新求值
特点: 是属性变化才执行getter函数,否则执行缓存默认的true指令打开缓存。
作用: 如果频繁使用计算属性,而计算属性方法中有大量的耗时操作(例如在getter中循环一个大的数组),会带来一些性能问题。计算属性缓存可以用来解决该问题。
get函数:
- 初次读取时会执行一次
- 当依赖的数据发生改变时会被再次调用。
备注:
- 计算属性最终会出现在vm上,直接读取使用即可
- 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变
用computed实现姓名案例:
<body>
<div id="root">
姓:<input type="text" v-model="firstName"> <br/><br/>
名:<input type="text" v-model="lastName"> <br/><br/>
全名:<span>fullName</span> <br/><br/>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
const vm = new Vue(
el:'#root',
data:
firstName:'张',
lastName:'三',
,
computed:
//完整写法
/* fullName:
get()
return this.firstName + '-' + this.lastName
,
set(value)
const arr = value.split('-')
this.firstName = arr[0]
this.lastName = arr[1]
*/
//简写
fullName()
return this.firstName + '-' + this.lastName
)
</script>
优势: 与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
methods和computed之间的区别:
- computed是在值发生改变的时候才会触发效果
- methods只要刷新执行了就会触发
watch
监视属性:
- 当被监视的属性变化时, 回调函数自动调用, 进行相关操作
- 监视的属性必须存在,才能进行监视
- 监视的两种写法:
- (1)new Vue时传入watch配置
- (2)通过
vm.$watch
监视
示例:
<body>
<div id="root">
<h2>今天天气很info</h2>
<button @click="changeWeather">切换天气</button>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
const vm = new Vue(
el:'#root',
data:
isHot:true,
,
computed:
info()
return this.isHot ? '炎热' : '凉爽'
,
methods:
changeWeather()
this.isHot = !this.isHot
,
//第一种写法
watch:
isHot:
immediate:true, //初始化时让handler调用一下
//handler什么时候调用?当isHot发生改变时。
handler(newValue,oldValue)
console.log('isHot被修改了',newValue,oldValue)
//简写
/* isHot(newValue,oldValue)
console.log('isHot被修改了',newValue,oldValue,this)
*/
)
//第二种写法
vm.$watch('isHot',
immediate:true,
handler(newValue,oldValue)
console.log('isHot被修改了',newValue,oldValue)
)
//简写
/* vm.$watch('isHot',(newValue,oldValue)=>
console.log('isHot被修改了',newValue,oldValue,this)
) */
</script>
深度监视:
- Vue中的watch默认不监测对象内部值的改变(一层)
- 配置
deep:true
可以监测对象内部值改变(多层)
<body>
<div id="root">
<h3>a的值是:numbers.a</h3>
<button @click="numbers.a++">点我让a+1</button>
<h3>b的值是:numbers.b</h3>
<button @click="numbers.b++">点我让b+1</button>
<button @click="numbers = a:666,b:888">彻底替换掉numbers</button>
numbers.c.d.e
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
const vm = new Vue(
el:'#root',
data:
isHot:true,
numbers:
a:1,
b:1,
c:
d:
e:100
,
watch:
//监视多级结构中某个属性的变化
/* 'numbers.a':
handler()
console.log('a被改变了')
*/
//监视多级结构中所有属性的变化
numbers:
deep:true,
handler()
console.log('numbers改变了')
)
</script>
备注:
- Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以
- 使用watch时根据数据的具体结构,决定是否采用深度监视
用watch属性实现姓名案例:
<body>
<div id="root">
姓:<input type="text" v-model="firstName"> <br/><br/>
名:<input type="text" v-model="lastName"> <br/><br/>
全名:<span>fullName</span> <br/><br/>
</div>
</body>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
const vm = new Vue(
el:'#root',
data:
firstName:'张',
lastName:'三',
fullName:'张-三'
,
watch:
firstName(val)
//在这里用到了定时器异步操作
setTimeout(()=>
console.log(this)
this.fullName = val + '-' + this.lastName
,1000);
,
lastName(val)
this.fullName = this.firstName + '-' + val
)
</script>
computed和watch之间的区别:
- computed能完成的功能,watch都可以完成。
- watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。
两个重要的小原则:
- 所有被Vue管理的函数,最好写成 普通函数,这样this的指向才是 vm 或 组件实例对象
- 所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成 箭头函数,这样this的指向才是 vm或 组件实例对象
除以上五种属性之外,还有template属性和render属性,均在下文用到。
Vue 三种模板
html模板
基于DOM的模板,模板都是可解析的有效的HTML插值
文本: 使用 语法,作用:替换实例上的属性值,当值改变时,插值内容处会自动更新
原生的html: 双大括号输出的是文本,不会解析html(想要解析html,可以使用指令v-html)
属性: 使用v-bind进行绑定,可以响应变化
<div id="wrap">
<p>你的名字是list.name</p>
</div>
<script>
var list =
name:"donna",
age:20
var vm = new Vue(
el:"#wrap",
data:list
);
</script>
字符串模板
先定义字符串模板,然后在vue 的选项对象里面利用template绑定。
区别:
- 字符串模板的优先级会比html模板高,如果html和字符串模板中都有内容,会用字符串模板里的内容替换html模板。
注意:
- 定义的字符串模板中根节点只能有一个
- 字符串用 ` 引起来是可以换行的
<div id="app"></div>
<script>
let data =
content: 'world',
var str = `<div> 你好!content</div>`
var vm = new Vue(
el: '#app',
data: data,
template: str
)
</script>
除了用变量定义模板字符串,还可以用script标签,给script 标签定义id,根节点只能有一个,将html结构写在一对script标签中,设置type="x-template"
,模板将会替换挂载的元素。挂载元素的内容都将被忽略。Vue实例的template属性设置为给定的script标签
template属性:
<div id="wrap"> </div>
<script type="x-template" id="app">
<div>
<p>他的名字是list.name</p>
</div>
</script>
<script>
var list =
name: "张三",
age: 20
var vm = new Vue(
el:"#wrap",
data:list,
template:"#app"
);
</script>
render函数模板
语法格式:
render(createElement)
createElement(标签名,[数据对象],子元素)//子元素为数组或对象
数据对象的属性:
- class: :绑定class
- style: :绑定样式
- attrs: :添加行间属性
- domProps: :DOM元素属性
- on: :绑定事件
<style>
.bgbackground:yellowgreen;
</style>
<div id="wrap">
<p>你的名字是list.name</p>
</div>
<script>
var list =
name:"donna",
age:20
var vm = new Vue(
el:"#wrap",
data:list,
render(createElement)
return createElement(
"ul",
class:bg:true,
style:listStyle:"none",
attrs:
name:"donna"
,
[
createElement("li","aaaaaa"),
createElement("li","bbbbbb"),
createElement("li","cccccc")
]
)
);
</script>
class与style绑定
class样式:
- 写法:
class="xxx"
:xxx可以是字符串、对象、数组 - 字符串写法 适用于:类名不确定,要动态获取
- 对象写法 适用于:要绑定多个样式,个数不确定,名字也不确定
- 数组写法 适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用
style样式:
:style="fontSize: xxx"
:其中xxx是动态值:style="[a,b]"
: 其中a、b是样式对象
以上是关于Vue 常用属性三种模板 总结的主要内容,如果未能解决你的问题,请参考以下文章