• el-form简单封装一个列表页中的搜索栏


    父组件如何使用    代码中注释很多, 应该很容易理解

    1. <script>
    2. import wgySearch from './wgySearch';
    3. // 这两个组件是给search组件传递的
    4. import wgySelect from './wgySelect';
    5. import wgyDatePicker from './wgyDatePicker';
    6. data 中
    7. // 搜索栏中的默认值
    8. searchDefault: {
    9. name: '',
    10. region: '',
    11. delivery: '',
    12. date: '',
    13. },
    14. // 配置项
    15. searchFields: [
    16. {
    17. label: '活动名称',
    18. model: 'name',
    19. },
    20. {
    21. label: '活动区域',
    22. model: 'region',
    23. template: {
    24. // tpl传一个wgySelect组件,专门用来只用来传数据
    25. tpl: wgySelect,
    26. attrs: {
    27. multiple: true,
    28. list: [
    29. { label: 'A', value: 1 },
    30. { label: 'B', value: 2 },
    31. ],
    32. },
    33. },
    34. },
    35. {
    36. label: '即时配送',
    37. slot: 'delivery', // 这里配置项是slot, 模板中才能使用slot对应的字段
    38. },
    39. {
    40. label: '活动时间',
    41. model: 'date',
    42. template: {
    43. tpl: wgyDatePicker,
    44. attrs: {
    45. type: 'daterange',
    46. 'value-format': 'timestamp',
    47. },
    48. },
    49. },
    50. ],
    51. reset和submit这两方法是搜索和重置的时候调用的
    52. script>

    wgySelect组件

    1. <script>
    2. export default {
    3. name: 'WgySelect',
    4. props: {
    5. value: {
    6. type: [Number, String, Array],
    7. required: true,
    8. },
    9. list: {
    10. type: Array,
    11. required: true,
    12. },
    13. },
    14. data() {
    15. return {
    16. value1: this.value,
    17. };
    18. },
    19. methods: {
    20. input(val) {
    21. this.$emit('input', val);
    22. },
    23. },
    24. };
    25. script>

    wgyDatePicker组件

    1. <script>
    2. export default {
    3. name: 'WgyDatepicker',
    4. props: {
    5. value: {
    6. type: [Array, Number, String],
    7. default: () => '',
    8. },
    9. },
    10. data() {
    11. return {
    12. value1: this.value,
    13. };
    14. },
    15. methods: {
    16. input(val) {
    17. this.$emit('input', val || '');
    18. },
    19. },
    20. };
    21. script>

    wgySearch 这个就是最主要的搜索组件了

    1. <script>
    2. import wgyTemplate from './wgyTemplate';
    3. export default {
    4. components: {
    5. wgyTemplate,
    6. },
    7. props: {
    8. // 绑定的值
    9. value: {
    10. type: Object,
    11. required: true,
    12. },
    13. leftButton: {
    14. type: String,
    15. default: () => '查询',
    16. },
    17. rightButton: {
    18. type: String,
    19. default: () => '重置',
    20. },
    21. // 每行元素个数
    22. lineNumber: {
    23. type: Number,
    24. default: () => 4,
    25. },
    26. // label 的宽度
    27. labelWidth: {
    28. type: String,
    29. default: () => '100px',
    30. },
    31. // 透传给el-form的属性配置
    32. formAttrs: {
    33. type: Object,
    34. default: () => ({}),
    35. required: false,
    36. },
    37. // 配置字段
    38. fields: {
    39. type: Array,
    40. required: true,
    41. },
    42. // 是否显示搜索按钮
    43. showSubmit: {
    44. type: Boolean,
    45. default: true,
    46. },
    47. // 是否显示重置按钮
    48. showReset: {
    49. type: Boolean,
    50. default: true,
    51. },
    52. // 最大默认显示搜索项个数 ,超过这个数字后会收起
    53. maxShowNum: {
    54. type: Number,
    55. default: 8,
    56. },
    57. // 按钮组class
    58. btnClass: {
    59. type: String,
    60. default: '',
    61. },
    62. // 自动包含下方的分割线(列表页常用)
    63. withDivider: {
    64. type: Boolean,
    65. default: true,
    66. },
    67. },
    68. data() {
    69. return {
    70. // 绑定的值
    71. formData: this.value,
    72. // 配置字段 < 默认显示搜索项个数
    73. showAll: this.fields.length < this.maxShowNum,
    74. };
    75. },
    76. computed: {
    77. // 处理placeholder
    78. innerFields() {
    79. return this.fields.map((field) => {
    80. const { template, label } = field;
    81. // 根据是否有template属性,生成默认的placeholder
    82. const defaultPlaceholder = template ? `请选择${label}` : `请输入${label}`;
    83. if (template) {
    84. // 如果有template属性,但没有attrs属性,初始化attrs为一个空对象
    85. template.attrs = template.attrs || {};
    86. // 如果attrs对象没有placeholder属性,使用默认的placeholder
    87. template.attrs.placeholder = template.attrs.placeholder || defaultPlaceholder;
    88. } else {
    89. // 如果没有template属性,且没有placeholder属性,使用默认的placeholder
    90. field.placeholder = field.placeholder || defaultPlaceholder;
    91. }
    92. return field;
    93. });
    94. },
    95. getWrapperStyle() {
    96. // 动态改变该元素的布局
    97. return {
    98. display: 'flex',
    99. flexWrap: 'wrap',
    100. };
    101. },
    102. getIsSameLine() {
    103. // 判断表单的字段数量是否小于等于每行的元素个数并且字段数量不能被每行的元素个数整除
    104. const { fields, lineNumber } = this;
    105. return fields.length <= lineNumber && !(fields.length % lineNumber === 0);
    106. },
    107. // 按钮的样式
    108. getBtnStyle() {
    109. return {
    110. textAlign: this.getIsSameLine ? 'left' : 'right',
    111. flex: 1,
    112. minWidth: '220px',
    113. marginBottom: '10px',
    114. };
    115. },
    116. /**
    117. * 计算表单标签的宽度
    118. * 如果用户已经设置了 labelWidth,则直接返回用户设置的值
    119. * 否则,根据表单字段的标签长度动态计算标签宽度
    120. */
    121. getLabelWidth() {
    122. if (this.labelWidth) {
    123. return this.labelWidth;
    124. }
    125. // 获取表单字段标签的最大长度
    126. const maxLength = Math.max(...this.fields.map((item) => item.label.length));
    127. if (maxLength <= 4) {
    128. return '80px';
    129. }
    130. if (maxLength > 4 && maxLength <= 6) {
    131. return '90px';
    132. }
    133. if (maxLength > 6 && maxLength < 10) {
    134. return '120px';
    135. }
    136. return '100px';
    137. },
    138. validate() {
    139. return this.$refs.form.validate;
    140. },
    141. },
    142. watch: {
    143. // 外层变化实时通知内部, 内部变化实时通知外部
    144. value: {
    145. deep: true,
    146. handler(newVal) {
    147. this.formData = newVal;
    148. },
    149. },
    150. formData: {
    151. deep: true,
    152. handler(newVal) {
    153. this.$emit('input', newVal);
    154. },
    155. },
    156. },
    157. methods: {
    158. // 搜索
    159. submit() {
    160. this.$emit('submit');
    161. },
    162. // 重置
    163. reset() {
    164. this.$emit('reset');
    165. },
    166. /*
    167. 获取每个输入框的宽度
    168. 如果attrs中有传入, 使用传入的宽度
    169. 如果是日期选择器,宽度是210
    170. 如果是日期时间选择器,宽度是340
    171. 其他的宽度都是180
    172. */
    173. getTempWidth(attrs = {}) {
    174. const { width, type } = attrs;
    175. if (width) {
    176. return width;
    177. }
    178. if (type === 'daterange') {
    179. return 210;
    180. }
    181. if (type === 'datetimerange') {
    182. return 340;
    183. }
    184. return 180;
    185. },
    186. },
    187. };
    188. script>
    189. <style lang="scss">
    190. .search-box {
    191. background: #fff;
    192. .slot-operator {
    193. border-bottom: 1px solid #eee;
    194. padding-bottom: 10px;
    195. margin-bottom: 10px;
    196. }
    197. .form-ctn {
    198. position: relative;
    199. .search-btn,
    200. .reset-btn {
    201. min-width: 0;
    202. }
    203. .reset-btn {
    204. margin-left: 8px;
    205. }
    206. }
    207. .el-form-item {
    208. margin-bottom: 16px;
    209. white-space: nowrap;
    210. }
    211. .el-form-item--small .el-form-item__label {
    212. padding-right: 5px;
    213. }
    214. .el-form-item--small .el-form-item__content {
    215. min-width: 180px;
    216. .el-date-editor--daterange .el-range-input {
    217. min-width: 70px;
    218. }
    219. }
    220. }
    221. .divider {
    222. box-sizing: border-box;
    223. background-color: #fafafb;
    224. height: 10px;
    225. border-top: 1px solid #eeeeee;
    226. border-bottom: 1px solid #eeeeee;
    227. }
    228. style>

    wgyTemplate  是wgySearch组件中的子组件

    1. <script>
    2. export default {
    3. name: 'WgyTemplate',
    4. props: {
    5. tpl: {
    6. type: [String, Object],
    7. required: true,
    8. },
    9. value: {
    10. type: [Number, String, Object, Array],
    11. required: true,
    12. },
    13. attrs: {
    14. type: Object,
    15. default: () => ({}),
    16. },
    17. },
    18. computed: {
    19. // 要渲染的组件
    20. dynamicComponent() {
    21. return this.tpl;
    22. },
    23. // 收集所有需要绑定到动态组件上的事件监听器
    24. listeners() {
    25. return {
    26. input: this.input,
    27. ...this.$listeners,
    28. };
    29. },
    30. },
    31. methods: {
    32. input(value) {
    33. this.$emit('input', value);
    34. },
    35. },
    36. };
    37. script>

  • 相关阅读:
    Go :测试写入屏障的位置和未发射位置(附完整源码)
    寻找小红书达人技巧有哪些,小红书行业黑话汇总!
    Docker安装Nginx
    Cholesterol-PEG-Amine 两亲性脂质衍生物胆固醇-聚乙二醇-氨基 CLS-PEG-NH2
    基于Python Django 的微博舆论、微博情感分析可视化系统(V2.0)
    高考成绩出来,如何选大学和专业?
    GEE开发之Modis_LAI数据分析和获取
    基于 Debian 部署 NFS 及其 NFS 配置
    在线客服功能介绍-了解常见在线客服系统的功能点
    xgboost 中的二阶导数为什么收敛更快?
  • 原文地址:https://blog.csdn.net/weixin_49035434/article/details/133740945