计算属性
在模版语法可以做简单的逻辑,但是复杂的逻辑不太适合。此时可以通过计算属性解决。
选项式
<template>
<p>
请输入您的年龄:<input type="number" v-model="age">
</p>
模版语法实现
<p>
是否成年:{{ age >= 18 ? '是' : '否' }}
</p>
计算属性实现
<p>
是否成年:{{ isDdult }}
</p>
</template>
<script>
export default {
data() {
return {
age: 0
}
},
//计算属性computed
computed: {
isDdult(){
return this.age >= 18 ? '是' : '否';
}
}
}
</script>组合式
<template>
<p>
请输入您的年龄:<input type="number" v-model="age">
</p>
模版语法实现
<p>
是否成年:{{ age >= 18 ? '是' : '否' }}
</p>
计算属性实现
<p>
是否成年:{{ isDdult }}
</p>
</template>
<script setup>
import {ref,computed} from 'vue';
let age = ref(0);
let isDdult = computed(()=>{
return age.value >= 18 ? '是' : '否';
});
</script>类和样式绑定
:class和:style是v-bind的中的一种,只不过vue对这两个进行了功能增强
:class
选项式
<template>
<!-- 绑定对象 -->
<p :class="{ 'myStyle1': isActive1, 'myStyle2': isActive2 }">测试文本</p>
<p :class="objStyle">测试文本</p>
<!-- 数组绑定 -->
<p :class="[arrStyle1,arrStyle2]">测试文本</p>
</template>
<script>
export default {
data() {
return {
isActive1: true,
isActive2: true,
objStyle: {
myStyle1: true,
myStyle2: false
},
arrStyle1: 'myStyle1',
arrStyle2: 'myStyle2'
}
}
}
</script>
<style>
.myStyle1 {
color: red;
}
.myStyle2 {
font-size: 30px;
}
</style>组合式
<template>
<!-- 绑定对象 -->
<p :class="{ 'myStyle1': testStyle.isActive1, 'myStyle2': testStyle.isActive2 }">测试文本</p>
<p :class="testStyle.objStyle">测试文本</p>
<!-- 数组绑定 -->
<p :class="[testStyle.arrStyle1,testStyle.arrStyle2]">测试文本</p>
</template>
<script setup>
import { reactive } from 'vue';
let testStyle = reactive({
isActive1: true,
isActive2: true,
objStyle: {
myStyle1: true,
myStyle2: false
},
arrStyle1: 'myStyle1',
arrStyle2: 'myStyle2'
})
</script>
<style scoped>
.myStyle1 {
color: red;
}
.myStyle2 {
font-size: 30px;
}
</style>:style
选项式
<template>
<p :style="myStyle">测试文本</p>
</template>
<script>
export default {
data() {
return {
myStyle: {
color: 'red',
fontSize: '30px',
backgroundColor: 'yellow'
}
}
}
}
</script>组合式
<template>
<p :style="myStyle">测试文本</p>
</template>
<script setup>
import { reactive } from 'vue';
let myStyle = reactive({
color: 'red',
fontSize: '30px',
backgroundColor: 'yellow'
})
</script>侦听属性
侦听属性watch:侦听data中的数据的变化,一旦数据发生变化watch中对应的函数就会被触发
选项式
<template>
<input type="text" v-model="message">
<h1>{{ message }}</h1>
</template>
<script>
export default {
data() {
return {
message: 'hello'
}
},
watch:{
// 函数的名称必须是被侦听的变量的名称
//newValue:改变后的值
//oldValue:改变前的值
message(newValue,oldValue){
console.log(newValue+":"+oldValue)
}
}
}
</script>组合式
<template>
<input type="text" v-model="message">
<h1>{{ message }}</h1>
</template>
<script setup>
import { ref, watch } from 'vue';
let message = ref("");
watch(message,(newValue,oldValue)=>{
console.log(newValue+":"+oldValue)
})
</script>深层侦听(侦听对象)
选项式
<template>
<input type="text" v-model="user.name">
<h1>{{ user.name }}</h1>
</template>
<script>
export default {
data() {
return {
user: {
name: '张三'
}
}
},
watch:{
user: {
handler(newValue,oldValue){
// 注意:在嵌套的变更中,
// 只要没有替换对象本身,
// 那么这里的 `newValue` 和 `oldValue` 相同
console.log(newValue.name+":"+oldValue.name)
},
deep: true
}
}
}
</script>组合式
<template>
<input type="text" v-model="user.name">
<h1>{{ user.name }}</h1>
</template>
<script setup>
import { reactive,watch } from 'vue';
let user = reactive({
name: '张三'
})
watch(user,(newValue, oldValue)=>{
// 在嵌套的属性变更时触发
// 注意:`newValue` 此处和 `oldValue` 是相等的
// 因为它们是同一个对象!
console.log(newValue.name+":"+oldValue.name)
})
</script>模版引用
模版引用:像js那样操纵dom
vue不推荐直接操纵dom,但是如果项目中不得不用,vue提供了方式操纵dom。
步骤 1、在节点上加上ref属性 2、通过this.$refs.属性名 获取dom
js获取和ref和refs区别:\refs方式获取可以用vue特性,js方式不行
选项式
<template>
<div ref="box" id="dd">{{ msg }}</div>
<button type="button" @click="getDom">获取dom</button>
</template>
<script>
export default {
data() {
return {
msg: "你好"
}
},
methods:{
getDom(){
//this.$refs.box方法获取dom,之后就可以使用js的属性方法操作dom了
console.log(this.$refs.box.innerHTML = '哈哈哈哈哈')
// console.log(document.getElementById('dd').innerHTML = '哈哈哈哈哈')
}
}
}
</script>组合式
<template>
<div ref="box" id="dd">{{ msg }}</div>
<button type="button" @click="getDom">获取dom</button>
</template>
<script setup>
import { ref } from 'vue';
let msg = ref('你好');
// 声明一个 ref 来存放该元素的引用
// 必须和模板里的 ref 同名
let box = ref(null);
function getDom(){
let dom = box.value;
console.log(dom)
dom.innerHTML = '哈哈哈哈哈'
}
</script>