zoukankan      html  css  js  c++  java
  • iview2 之select二级联动细谈

    还是二级联动问题,之前的方法是可以实现二级联动的。但是理想很丰满,现在很骨感。因为后台可能也没法给你理想的数据结构。最后想到办法的利用两个接口拿到数据,实现渲染。直接来代码

    <template>
      <div class="m-long">
        <Form ref="formValidate" :model="formValidate"
              :rules="ruleValidate" :label-width="100"
              label-position="left">
          <FormItem label="一级栏目" prop="categoryIdName">
            <Select v-model="formValidate.categoryIdName"
                    placeholder="请选择一级栏目"
                    @on-change="changeSecList"
                    :label-in-value    ="true"
                    style="200px">
              <Option v-for="item in categoryList" v-if="item.firstname"
                      :value="item.id" :key="item.id"  :label="item.firstname">
                {{ item.firstname }}
              </Option>
            </Select>
          </FormItem>
          <FormItem label="二级栏目" prop ='name'>
            <Select v-model="formValidate.name"
                    placeholder="请选择二级栏目"
                    @on-change="getCategoryId"
                    :label-in-value    ="true"
                    style="200px">
              <Option v-for="item in secondnameList"
                      :value="item.id" :key="item.id" :label="item.name">
                {{ item.name }}
              </Option>
            </Select>
          </FormItem>
         </Form>
      </div>
    </template>
    
    <script>
      import { ruleValidate } from '@/constants/article';
      import {
        geSecondCategory
      } from '@/api/article';
      export default {
        name: 'long',
        props: {
          categoryList: {  // 父级传来的一级栏目列表
            type: Array,
          },
          allDataList: { // 文章列表
            type: Array,
          }
        },
        data() {
          return {
            secondnameList: [], // 二级栏目列表
            formValidate: {
              secondname: '',
              categoryIdName: '',
              categoryId: '',
            },
            ruleValidate: ruleValidate, // 校验
          };
        },
        
        methods: {
          // 获取二级栏目
          changeSecList(val) {
            this.formValidate.categoryIdName = val.value
            this.geSecondCategory(val.value)
          },
          async geSecondCategory(id) {
            let res = await geSecondCategory(id)
            this.secondnameList = res.data.content
          },
          // 存入二级categoryId
          getCategoryId (val) {
            this.formValidate.categoryId = val.value
            console.log(val.value)
          },
        // 根据是否有文章ID渲染页面
          async init() {
            this.articleId = this.$route.query.articleId || '';
            if (this.articleId) {
              let { data } = await getArticles(this.articleId);
              this.formValidate = data;
              if (this.allDataList.length) {
                this.allDataList.forEach((item, index) => {
                  if (data.categoryId === item.id) {
                    this.formValidate.name = data.categoryId
    this.formValidate.categoryIdName = item.firstId
                    this.geSecondCategory(item.firstId)
                  }
                })
              } else {
                this.init()
              }
            }
          },
        },
        mounted() {
          this.init();
        },
      };
    </script>

    遇到的问题与解决方法

    1.select默认只返回一个值,但我同时需要firstId与firstname两个参数。解决方法:label-in-value(是否将 label 和 value 一并返回,默认只返回 value),这个api主要帮我实现将firstId传给获取二级栏目当参数,firstname传给保存接口。

    2.渲染问题:1)没注意:key这个参数。写的是:key="item.firstId"结果死活都渲染不出我想要的数据。因为在没使用:label这个api是没有任何问题的,最后仔细想想原来对象渲染的问题key与value当然要对应不然怎么实现渲染,想打自己。

          2)on-change事件中选中的Option变化时触发,默认返回 value,如需返回 label,详见 label-in-value 属性。这是官网给写的解释,所以:label应该显示firstname,那:value与:key就得用id与进行匹配。

          3)当文章是处于编辑状态,当然要把文章渲染进来。可是由于生命周期的原因一开始拿不到父级传的数据,有考虑过数组更新没渲染的问题,使用$set去解决。但并没效果,就想到了如果没有获取到数据就再次渲染直到拿到数据。终于搞定。不知道哪位大                                佬有更好的解决方案。

    当解决完这些问题,都觉得好简单,但是当时可不是这种想法。到这里,所有的事情都解决,等待上线。

  • 相关阅读:
    OracleConnection is obsolete
    ORA-12899: value too large for column (actual: 27, maximum: 20)
    快速删除有外键关联的数据库的数据
    Could not load type 'System.Reflection.AssemblySignatureKeyAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c
    RegSvr32注册OCX时报错
    EF:Oracle.DataAccess.Client.OracleException: ORA-12154: TNS:could not resolve the connect identifier specified
    EF:The provider did not return a ProviderManifest instance
    EF:split your EDMX file into multiple diagrams
    读《这就是搜索引擎:核心技术详解》有感总结
    c++ 类成员变量初始化总结
  • 原文地址:https://www.cnblogs.com/yilihua/p/12725653.html
Copyright © 2011-2022 走看看