小言_互联网的博客

记录Vue+Element UI 二次封装Select

442人阅读  评论(0)

 

第一次用这玩意,花了2天研究了下Vue,看了下Element UI的控件,觉得简直是颠覆三观,尼玛这个项目大把时间都花在前端了。。。。

花了大半天封装了一个Select,好多坑。

先上代码

组件


  
  1. <template>
  2. <div>
  3. <!--$attrs参数透传 原本控件的参数 如果是自己新加的就必须单独写,不然读取不到 -->
  4. <el-select v-bind= "$attrs"
  5. v-model= "value"
  6. v-bind:api= "api"
  7. v-on:change= "change"
  8. :optionList= "optionList">
  9. <el-option v- for= "item in GetoptionList"
  10. :key= "item.value || item.ID"
  11. :label= "item.label || item.Name"
  12. :value= "item.value || item.ID"
  13. :disabled= "item.disabled">
  14. </el-option>
  15. </el-select>
  16. </div>
  17. </template>
  18. <script>
  19. import axios from 'axios'
  20. export default {
  21. name: "h3select",
  22. data() {
  23. return {
  24. //value: null,
  25. optionList: null,
  26. api: null
  27. }
  28. },
  29. // 使用计算属性用于回显问题
  30. computed: {
  31. //value: function () {
  32. // return this.$attrs.value || ''
  33. //},
  34. value: {
  35. get() {
  36. return this.$attrs.value || null
  37. },
  38. set: function (selectval) {
  39. //console.log(selectval);
  40. this.$attrs.value = selectval || null;
  41. }
  42. },
  43. // 是否禁用
  44. disabled() {
  45. return this.$attrs.disabled || false
  46. },
  47. // 下拉选列表
  48. GetoptionList() {
  49. if ( this.$attrs.api != null) {
  50. return this.optionList; //获取当前组件上的属性
  51. }
  52. else {
  53. return this.$attrs.optionList; //获取本实例上传进来的属性
  54. }
  55. },
  56. // 输入框尺寸
  57. size() {
  58. return this.$attrs.size
  59. },
  60. // 提示信息
  61. placeholder() {
  62. return this.$attrs.placeholder || '请选择'
  63. },
  64. // 是否可搜索
  65. filterable() {
  66. return this.$attrs.filterable === false ? this.$attrs.filterable : true
  67. },
  68. //是否可以清空选项
  69. clearable() {
  70. return this.$attrs.clearable || false
  71. }
  72. },
  73. methods: {
  74. change( val) {
  75. 触发当前实例上的事件
  76. this.$emit( 'change', val);
  77. },
  78. getCompany() {
  79. if ( this.$attrs.api != null) {
  80. axios. get( this.$attrs.api, { // 还可以直接把参数拼接在url后边
  81. params: {
  82. Name: '' //参数
  83. }
  84. }).then(res => { //这个地方如果要访问this.XXXX 必须用res=> {}方式
  85. this.optionList = res. data;
  86. }). catch(function (error) {
  87. console.log(error);
  88. });
  89. }
  90. }
  91. },
  92. created() {
  93. this.getCompany();
  94. }
  95. }
  96. </script>

 写组件的时候,遇到的一些问题:

1、获取页面上的参数,如果没有加bing,组件里是获取不到的,v-bind="$attrs",这个俊是参数透传,只要原本参数存在的,组件里面通过this.$attrs.XXX就能设置/获取它们。

2、axios方法then的时候一定要用res=>{},不要用function(res){},他们访问的this是不一样的,这个问题坑了好久

3、控件默认值用了计算属性

4、绑定option的时候,试了下||,居然可以,提高兼容性。

vue页面


  
  1. <h3select v-model= "vip.option"
  2. :optionList= "vip.optionList"
  3. :placeholder= "vip.placeholder"
  4. :size= "'mini'"
  5. :clearable= "vip.clearable"
  6. :filterable= "vip.filterable"
  7. :api= "vip.api"
  8. style= "width: 200px;"
  9. class= "filter-item"
  10. :label= "'VIP'"
  11. @change= "changevip_option"></h3select>

  
  1. data() {
  2. return {
  3. vip: {
  4. api: "http://......./GetCompanyList",
  5. //select选项 true false 必须要加单引号。不然控件选择false无法选中
  6. optionList: '', //[{ label: '是', value: 'true' }, { label: '否', value: 'false' }], //, disabled: true
  7. //选中项 默认值
  8. option: null,
  9. //api
  10. //开启清理
  11. clearable: true,
  12. //底纹字
  13. placeholder: '是否VIP',
  14. //筛选
  15. filterable: true,
  16. }
  17. }}

开始用测试对象是[{ label: '是', value: true}, { label: '否', value: false}],结果发现当选false的时候,值改变了,但是无法选中。改成字符串才正常了。还有数据值是数字的也有坑,直接显示数字了,文本就不出来。

class style 这种的会原样输出。

 

引用


  
  1. //引入自定义组件
  2. import H3globalVue from './components/index'
  3. Vue. use(H3globalVue);

在main.js中,全局注册,就不用每个页面都去加了。路径也是个坑,搞了好久。

要疯,简直反人类。。。

 

 

 

 

 

 


转载:https://blog.csdn.net/cmhdl521/article/details/116237123
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场