数据绑定
v-bind
v-model
sync
单向绑定 v-bind
- 数据只能从 data 流向页面,
v-bind:attr="xxx"
可以简写成:attr="xxx"
- 可以绑定其他属性,通常在属性前面加上冒号,这样属性等号后面的值就当作 JS 表达式来解析
双向绑定 v-model
- 数据不仅可以从 data 流向页面,也可以从页面流向 data,只能应用于表单元素
v-model:value="xxx"
可以简写为v-model="xxx"
,默认收集的是 value 值(重要)label
标签为input
元素定义标注(标记);它不会向用户呈现任何特殊效果。不过,它为鼠标用户改进了可用性。如果您在 label 元素内点击文本,就会触发此控件。就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上;使用for
属性指定表单控件的id
- 若
<input type="text"/>
,则收集 value 值,用户的输入就是 value 值 - 三个修饰符(重要)
v-model.lazy
失去焦点再收集数据v-model.number
输入字符串转为有效数字(整数,有加减号)v-model.trim
去除首尾空格
html
<!-- 收集表单数据 -->
<form action="/submit" method="post" @submit.prevent="表单提交事件"> <!-- action 指定表单提交的地址,不过基本不用 -->
<label for="demo">账号</label> <!-- 用 lable 之后,点击“账号”也可以使输入框获取焦点 -->
<input type="text" id="demo" v-model.trim="userInfo.account"> <!-- trim 去掉前后的空格 -->
密码:<input type="password" v-model="userInfo.password">
年龄:<input type="number" v-model.number="userInfo.age"> <!-- 字符串转数字 -->
性别: <!-- 单选,需配置相同的 name 和 value 属性,收集 value 值 -->
男<input type="radio" name="sex" v-model="userInfo.sex" value="male">
女<input type="radio" name="sex" v-model="userInfo.sex" value="female">
<!-- 多选,如果没有 value 属性,或者有 value 属性,但是 v-model 初始值不是数组,则收集是否选择的布尔值,即 checked 属性值;如果配置了 value 属性,且 v-model 初始值为数组,则收集 value 组成的数组 -->
爱好:
学习<input type="checkbox" v-model="userInfo.hobby" value="study">
打游戏<input type="checkbox" v-model="userInfo.hobby" value="game">
吃饭<input type="checkbox" v-model="userInfo.hobby" value="eat">
所属校区
<select v-model="userInfo.city">
<option value="">请选择校区</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="shenzhen">深圳</option>
<option value="wuhan">武汉</option>
</select>
其他信息:
<textarea v-model.lazy="userInfo.other"></textarea>
<button type="submit">提交</button>
<button type="reset">重置</button>
<!-- 表单中的按钮,如果不配置 type 属性,会被当成提交按钮,点击按钮会触发表单数据提交,提交的地址和方法在 form 标签的 action 和 method 中配置,同时会刷新页面。点击提交按钮会触发 form 标签的 submit 事件 -->
</form>
<script>
const userInfo = {
account: '',
password: '',
age: 18,
sex: 'female',
hobby: ['study'],
city: 'beijing',
other: '',
agree: false,
}</script>
表单相关知识
- form 标签用于收集表单数据,里面主要包裹 input,textarea等输入类型元素
- form 标签具有几个属性,action 表示想服务器提交表单的地址,method 表示提交表单的方法,表单提交时会触发 confirm 事件
- form 标签中的 button 如果不指定 type,则默认为 submit,点击按钮时会触发表单的 confirm 事件
sync 修饰符
- sync 修饰符可以实现类似 v-model 的双向绑定,因为一个组件只能有一个 v-model,而且 props 的数据是不可以修改的,所以需要双向绑定 props 的数据或其他数据的时候,可以用 sync 修饰符。它也是组件通信方式的一种;
:money.sync
表示父组件通过 props 给子组件传递一个数据money
,同时给当前子组件绑定一个自定义事件update:money
html
<child :show="show" @update:show="show=$event"></child>
<!-- 等价于 -->
<child :show.sync="show"></child>
<!-- 注意:子组件中触发自定义事件的形式必须类似如下 -->
<script>
this.$emit("update:show", !this.show)
</script>
<!-- 在 Vue 3 中,v-model 可以绑定多个值,替代了 sync v-model:demo="" v-model:test="" -->
element 中 sync 的使用
因为 el-dialog 也是一个组件,需要将 visible 这个属性值传递给 el-dialog,在 el-dialog 组件中也有改变 visible 属性值的方法,为了父组件能接收到,所以用了 sync 修饰符
vue
<template>
<el-button @click="dialogTableVisible=true">点击显示对话框</el-button>
<el-dialog :visible.sync="dialogTableVisible"></el-dialog>
</template>
<script>
export default {
data() { return { dialogTableVisible: false; }}
}
</script>