介绍
layui 是一款开源的前端UI框架,基于经典的web前端技术栈,微信小程序风格的UI设计,致力于提供适合大多数后台系统的UI界面组件库。作为一个常用的前端框架,它可以为开发者提供便捷的开发方式,它不仅支持基础的表单功能,还提供了多种表单类型以满足开发者各种需求。在实际的开发中,通过关联表单可以将不同表单或者子表单之间的数据进行关联,从而达到优化表单的效果。
使用方法
表单相关的元素
在使用关联表单之前,我们首先需要了解一下表单相关的元素。其中,包括:
<form></form>:表单元素。
<input>:表单域元素。
<select></select>:选择框元素。
<option></option>:选择框选项元素。
<form></form>元素为表单的一个容器,它可以包含表单元素,表单元素包括<button>、<fieldset>、<input>、<label>、<legend>、<optgroup>、<option>、<select>和<textarea>。
实现关联表单的方法
layui提供了两种方法实现关联表单:观察者模式和从表单组件封装。
观察者模式
观察者模式是一种设计模式,它定义了对象之间的一对多的依赖关系,当一个对象的状态发生改变时,它的所有依赖者都会收到通知,并自动刷新。在layui框架中,我们可以通过事件来实现观察者模式关联表单的功能。具体步骤如下:
1. 定义事件:
// 观察者模式:定义事件
form.on('select(province)', function(data){
var value = data.value;
console.log('省份: ' + value);
// 触发下一级的事件
form.render('select');
form.on('select(city)', function(data){
var value = data.value;
console.log('城市: ' + value);
form.render('select');
form.on('select(country)', function(data){
var value = data.value;
console.log('区县: ' + value);
form.render('select');
});
});
});
其中,on方法用于定义事件,事件名称为select(province),也就是监听省份选择框的选择事件。当省份选择框发生变化时,我们需要触发下一级的事件,形成联动效果。
2. 定义表单元素:
<form class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">省份</label>
<div class="layui-input-block">
<select name="province" lay-filter="province">
<option value=""></option>
<option value="0">江苏省</option>
<option value="1">浙江省</option>
<option value="2">湖北省</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">城市</label>
<div class="layui-input-block">
<select name="city" lay-filter="city">
<option value=""></option>
<option value="0">南京市</option>
<option value="1">苏州市</option>
<option value="2">无锡市</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">区县</label>
<div class="layui-input-block">
<select name="country" lay-filter="country">
<option value=""></option>
<option value="0">玄武区</option>
<option value="1">秦淮区</option>
<option value="2">江宁区</option>
</select>
</div>
</div>
</form>
在这里,我们定义了三个select元素,分别为province、city和country。其中,元素的属性lay-filter指定事件名称,保证每个元素都可以相互触发,达到联动效果。
从表单组件封装
从表单组件封装的方式是通过将多个表单组件封装成一个父组件的方式来实现联动效果。该方式通过在父组件中定义监听事件并封装子组件,实现子组件之间的联动。这种方式在代码的复用和维护方便性上都有优势。具体步骤如下:
1. 定义父组件:
<div class="main">
<province-panel ref="provincePanel"></province-panel>
<city-panel ref="cityPanel"></city-panel>
<country-panel ref="countryPanel"></country-panel>
</div>
在这里,我们定义了一个包含三个子组件的父组件,其中ref属性定义组件的引用名称。
2. 定义子组件:
Vue.component('province-panel', {
template: '#provinceTpl',
props: ['onProvinceSelected'],
data: function() {
return {
provinces: [{ id: 0, name: '江苏省' }, { id: 1, name: '浙江省' }, { id: 2, name: '湖北省' }],
currentProvince: null
};
},
methods: {
onProvinceChanged: function() {
if (this.currentProvince) {
this.onProvinceSelected(this.currentProvince.id);
}
}
},
});
在这里,我们定义了province-panel子组件,具有两个主要作用:1) 显示省份列表;2) 触发父组件的onProvinceSelected方法。其中,onProvinceChanged方法负责获取当前省份的id并调用onProvinceSelected方法。
3. 触发子组件事件:
Vue.component('city-panel', {
template: '#cityTpl',
props: ['onCitySelected'],
data: function() {
return {
cities: [],
currentCity: null
};
},
methods: {
onProvinceSelected: function(id) {
var _this = this;
// 加载城市列表
_this.cities = [{ id: 0, name: '南京市' }, { id: 1, name: '苏州市' }, { id: 2, name: '无锡市' }];
_this.currentCity = _this.cities[0];
_this.onCitySelected(_this.currentCity.id);
},
onCityChanged: function() {
if (this.currentCity) {
this.onCitySelected(this.currentCity.id);
}
}
},
});
在这里,我们定义了city-panel子组件,该组件传入了父组件的onCitySelected方法。当onProvinceSelected方法被触发时,该组件会动态加载城市列表,并调用父组件的onCitySelected方法。onCityChanged方法负责获取当前城市的id并调用onCitySelected方法。
4. 定义联动结果:
Vue.component('country-panel', {
template: '#countryTpl',
props: ['onCountrySelected'],
data: function() {
return {
countries: [],
currentCountry: null
};
},
methods: {
onCitySelected: function(id) {
var _this = this;
// 加载区县列表
_this.countries = [{ id: 0, name: '玄武区' }, { id: 1, name: '秦淮区' }, { id: 2, name: '江宁区' }];
_this.currentCountry = _this.countries[0];
_this.onCountrySelected(_this.currentCountry.id);
},
onCountryChanged: function() {
if (this.currentCountry) {
this.onCountrySelected(this.currentCountry.id);
}
}
},
});
在这里,我们定义了country-panel子组件,该组件传入了父组件的onCountrySelected方法。当onCitySelected方法被触发时,该组件会动态加载区县列表,并调用父组件的onCountrySelected方法。onCountryChanged方法负责获取当前区县的id并调用onCountrySelected方法。
总结
通过以上两种方式,我们可以实现表单之间的联动效果,提高表单数据的关联性,为用户提供更好的体验。需要注意的是,观察者模式在性能和代码可维护性方面都有一些优劣,需要根据实际情况选择。从表单组件封装方法更适合模块化和组件化的开发。