typora/note/前端/vue3/vue语法.md
2024-12-12 10:48:55 +08:00

472 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### 动态绑定
```html
<script>
export default{
data(){
return {
dynamicClass: "dyclass",
msg: "Hello V-Bind",
buttonDisabled: true,
bindObjects: {
id: 1,
class: "dyclass"
}
}
}
}
</script>
<template>
<h3>动态绑定</h3>
<!-- 动态绑定与简写 -->
<div :class="dynamicClass" v-bind:title="msg">{{ msg }}</div>
<!-- 动态绑定布尔值 -->
<button :disabled="buttonDisabled">Button</button>
<!-- 以属性的方式动态绑定多个值-->
<div v-bind="bindObjects">动态绑定</div>
</template>
<style>
.dyclass {
font-size: 50px;
color: red;
}
</style>
```
### 条件渲染
- v-if只有条件值为v-if的时候才会渲染
- v-else
- v-else-if
- v-show每次都会渲染v-show只会更改css的display属性
```html
<script>
export default {
data() {
return {
flag: false,
type: "B"
}
}
}
</script>
<template>
<h3>条件渲染</h3>
<div v-if="flag">能看见我吗</div>
<div v-else>那你还是看看我吧</div>
<div v-if="type === 'A'">A</div>
<div v-else-if="type === 'B'">B</div>
<div v-else-if="type === 'C'">C</div>
<div v-else>Not ABC</div>
<!-- v-show -->
<div v-show="flag">v-show</div>
</template>
```
### 列表渲染
- 简单数据
```html
<script>
export default {
data() {
return {
names: ["Sun", "Li", "Zhang"]
}
}
}
</script>
<template>
<h3>列表渲染</h3>
<div>
<p v-for="(name, index) in names">
{{ name }}-{{ index }}
</p>
</div>
</template>
```
- 复杂数据
```html
<script>
export default {
data() {
return {
names: [{
"id": 1,
"name": "Sun",
"avatar": "https://t7.baidu.com/it/u=4162611394,4275913936&fm=193&f=GIF",
},
{
"id": 2,
"name": "Li",
"avatar": "https://t7.baidu.com/it/u=1951548898,3927145&fm=193&f=GIF",
},
{
"id": 3,
"name": "Zhang",
"avatar": "https://t7.baidu.com/it/u=2405382010,1555992666&fm=193&f=GIF",
}]
}
}
}
</script>
<template>
<h3>列表渲染</h3>
<div v-for="name of names">
<p>{{ name.id }} - {{ name.name }}</p>
</div>
<div v-for="name of names">
<p>{{ name.id }} - {{ name.name }}</p>
<img :src="name.avatar" alt="" width="10%">
</div>
</template>
```
- 遍历一个对象的所有属性
```html
<script>
export default {
data() {
return {
userInfo: {
id: 1,
name: "Sun",
avatar: "https://t7.baidu.com/it/u=4162611394,4275913936&fm=193&f=GIF"
}
}
}
}
</script>
<template>
<h3>列表渲染一个对象的所有属性</h3>
<p v-for="item in userInfo">{{ item }}</p>
<p v-for="(item, key, index) in userInfo">
{{ item }} - {{ key }} - {{ index }}
</p>
</template>
```
### 事件处理
- v-on
- 简写`:on` 或`@`
- 内联事件处理器
```html
<template>
<div>
<button v-on:click="count++">按钮</button>
{{ count }}
</div>
</template>
<script>
export default {
data() {
return {
count: 0
}
}
}
</script>
```
- 方法事件处理器
```html
<template>
<div>
<button v-for="(name, index) in names" v-on:click="clickName($event, name)">{{ name }} - {{ index }}</button>
</div>
</template>
<script>
export default {
data() {
return {
names: ["Sun", "Li", "Zhang"]
}
},
methods: {
clickName(e, name) {
console.log(name)
console.log(e)
}
}
}
</script>
```
### 事件修饰符
```html
<template>
<div>
<a v-on:click="clickHandleByJS" href="https://www.baidu.com">访问百度</a>
<br>
<a v-on:click.prevent="clickHandleByVUE" href="https://www.baidu.com">访问百度</a>
</div>
</template>
<script>
export default {
methods: {
clickHandleByJS(e) {
e.preventDefault()
console.log("点击")
},
clickHandleByVUE(e) {
console.log("点击vue")
}
}
}
</script>
```
### 数组动态监听
- 数组调用以下方法是,会动态的更新循环列表
- push
- pop
- shift
- unshift
- splice
- sort
- reverse
```html
<template>
<div>
<h3>数组动态监听</h3>
<button @click="clickHandle">数组监听reverse</button>
<ul>
<li v-for="(name, index) in names" :key="index">{{ name }} - {{ index }}</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
names: ["Sun", "Li", "Zhang"]
}
},
methods: {
clickHandle() {
this.names.reverse()
}
}
}
</script>
```
### 计算属性
- 计算属性会基于其响应式依赖被缓存,一个计算属性只会在其响应式依赖更新时重新计算
```html
<template>
<div>
<h3>计算属性</h3>
<p>{{ info.title }}</p>
<p>{{ info.names.length > 0 ? "yes" : "no" }}</p>
<p>{{ nameLengthGtZero }}</p>
<p>{{ nameLengthGtZero }}</p>
<p>{{ nameLengthGtZero }}</p>
</div>
</template>
<script>
export default {
data(){
return {
info: {
names: ["sun", "li", "zhang"],
title: "this is a title"
}
}
},
computed: {
nameLengthGtZero() {
console.log("computed run")
return this.info.names.length > 0 ? "yes" : "no"
}
}
}
</script>
```
### 侦听器
```html
<template>
<div>
<h3>监听器</h3>
<p>{{ msg }}</p>
<button @click="updateMessage">修改msg</button>
</div>
</template>
<script>
export default {
data() {
return {
msg: "hello"
}
},
methods: {
updateMessage() {
this.msg = "world"
}
},
watch: {
// 函数名必须与侦听的对象名保持一致
msg(newValue, oldValue){
// newValue 新值
// oldValue 旧值
console.log(newValue, oldValue);
}
}
}
</script>
```
### 表单输入绑定
```html
<template>
<div>
<h3>表单输入绑定</h3>
<form action="">
<input type="text" v-model.lazy="message">
<p>{{ message }}</p>
</form>
</div>
</template>
<script>
export default {
data(){
return {
message: ""
}
}
}
</script>
```
- 修饰符
- `lazy`:取消每次 `input` 事件后更新数据,改为在每次 `change` 事件后更新数据
- `trim`:去除空格
- `number`: 转为数字
### 模板引用
- 获取DOM
```html
<template>
<div ref="container" class="container"> {{ className }}</div>
<button @click="getDivRef">加载div——dom</button>
</template>
<script>
export default {
data() {
return {
className: "容器"
}
},
methods: {
getDivRef() {
console.log(this.$refs.container)
this.$refs.container.innerHTML = "啊哈"
}
}
}
</script>
```
### 组件传递数据
- props
- 只能父组件向子组件传递数据,不能反向传递
- 子组件
```html
<template>
<p>{{ title }}</p>
<p>{{ age }}</p>
</template>
<script>
export default {
data (){
return {}
},
props: ["title", "age"]
}
</script>
```
- 父组件
```html
<template>
<h3>Parent</h3>
<p>静态数据传递</p>
<Child title="传递title" age="20"/>
<p>动态数据传递</p>
<Child :title = "message" :age="age"/>
<button @click="updateDynamicProps">点击修改动态传递数据</button>
</template>
<script>
import Child from "./Child.vue"
export default {
data() {
return {
message: "动态数据传递",
age: 20
}
},
components: {
Child
},
methods :{
updateDynamicProps() {
this.message = "动态数据更新"
this.age = 30
}
}
}
</script>
<style scoped>
</style>
```