双向绑定原理
- Vue的响应式系统:Vue通过
Object.defineProperty()
方法对数据进行劫持,将数据的读写转化为getter
和setter
函数。当数据发生变化时,setter
会触发依赖收集和派发更新。
- 指令系统:在表单绑定中,
v-model
指令是双向绑定的关键。它会根据表单元素的类型(如input
、select
等),在表单元素的input
或change
事件触发时,更新绑定的数据;同时,当数据变化时,通过getter
获取新数据并更新表单元素的值。
省市联动表单组件实现思路
- 获取数据:通过
axios
等HTTP库从接口获取省和市的数据。
- 数据结构:省数据是一个数组,每个省对象包含省ID和省名称;市数据也是数组,每个市对象包含市ID、市名称以及所属省ID。
- 双向绑定:使用
v-model
实现省和市选择的双向绑定。
- 联动逻辑:当省选择发生变化时,根据所选省的ID过滤出对应的市数据。
关键代码片段
<template>
<div>
<select v-model="selectedProvince">
<option v-for="province in provinces" :key="province.id">{{ province.name }}</option>
</select>
<select v-model="selectedCity">
<option v-for="city in cities" :key="city.id">{{ city.name }}</option>
</select>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
provinces: [],
cities: [],
selectedProvince: null,
selectedCity: null
};
},
mounted() {
this.fetchProvinces();
},
methods: {
fetchProvinces() {
axios.get('/api/provinces')
.then(response => {
this.provinces = response.data;
if (this.provinces.length > 0) {
this.selectedProvince = this.provinces[0].id;
this.fetchCities();
}
});
},
fetchCities() {
axios.get(`/api/cities?provinceId=${this.selectedProvince}`)
.then(response => {
this.cities = response.data;
if (this.cities.length > 0) {
this.selectedCity = this.cities[0].id;
}
});
}
},
watch: {
selectedProvince() {
this.fetchCities();
}
}
};
</script>