iview的下拉框select无法渲染数据问题

导读:本篇文章讲解 iview的下拉框select无法渲染数据问题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

问题代码:

			<FormItem label="选择系统:" >
                <Select style="width:350px"  v-model="systemFolderName" placeholder="请选择系统"
                 @on-open-change="changeSelect" @on-change="getLogFileNames" filterable
                 @on-query-change="changeSelect">
                    <OptionGroup  v-for="(item,index) in systemSourceResponceData" :label="item.systemGroupName"  :key="index">
                        <Option v-for="(subitems,subindexs) in item.systemList" :value="subitems.systemName" :key="subindexs" :disabled="item.systemList[0].systemName=='无数据'">{{ subitems.systemName }}</Option>
                    </OptionGroup>
                </Select>
            </FormItem>
            <FormItem label="选择文件:">
                <Select v-model="fileName" style="width:350px" placeholder="请选择文件"  @on-change="getFilesize" filterable>
                    <Option v-for="(item, index) in files" :value="item.value" :key="item.value + index">{{ item.label }}</Option>
                </Select>
            </FormItem>
getLogFileNames(){
            if(this.systemFolderName == null){
                this.$Message.error({
                    content:"请选择系统",
                    duration:2
                });
                return;
            }
            var path = this.systemFolderName;
            this.showFilesize=false;
            this.fileName=null;               
            this.$axios.get("/filedownload/files",
                {
                    params:{
                        path: path,
                    }
                })
                .then((response) =>{
                    var list = response.data.body;
                    this.files=[];
                    for(var i=0;i<list.length;i++){
                            this.files.push({
                                    value:list[i],
                                    label:list[i]
                                });
                        }
                })
                .catch(function(error){
                    console.error(error);
                })
        },

此段代码的逻辑为:选择系统后,将系统所属的文件名称加载到文件下拉框中。按正常的逻辑,files数组中有数据的话,那么文件下拉框就会有数据。然而如果你像上面的代码那样写你就会发现,你切换系统后进行选择,文件数组files[]有值,而下拉框却没有渲染出数据。

正确写法

			<FormItem label="选择系统:" >
                <Select style="width:350px"  v-model="systemFolderName" placeholder="请选择系统"
                 @on-open-change="changeSelect" @on-change="getLogFileNames" filterable
                 @on-query-change="changeSelect">
                    <OptionGroup  v-for="(item,index) in systemSourceResponceData" :label="item.systemGroupName"  :key="index">
                        <Option v-for="(subitems,subindexs) in item.systemList" :value="subitems.systemName" :key="subindexs" :disabled="item.systemList[0].systemName=='无数据'">{{ subitems.systemName }}</Option>
                    </OptionGroup>
                </Select>
            </FormItem>
            <FormItem label="选择文件:">
            	<!--加一个v-if来控制下拉框的加载-->
                <Select v-if="rendering" v-model="fileName" style="width:350px" placeholder="请选择文件"  @on-change="getFilesize" filterable>
                    <Option v-for="(item, index) in files" :value="item.value" :key="item.value + index">{{ item.label }}</Option>
                </Select>
            </FormItem>
getLogFileNames(){
            if(this.systemFolderName == null){
                this.$Message.error({
                    content:"请选择系统",
                    duration:2
                });
                return;
            }
            var path = this.systemFolderName;
            this.showFilesize=false;
            this.fileName=null; 
            //文件下拉框失效   
            this.rendering = false;                
            this.$axios.get("/filedownload/files",
                {
                    params:{
                        path: path,
                    }
                })
                .then((response) =>{
                    var list = response.data.body;
                    this.files=[];
                    for(var i=0;i<list.length;i++){
                            this.files.push({
                                    value:list[i],
                                    label:list[i]
                                });
                        }
                        //文件下拉框重新加载
                        this.rendering = true;
                })
                .catch(function(error){
                    console.error(error);
                })
        },

核心在于添加一个v-if来控制文件下拉框的加载,才能保证数据的渲染。如果这样尝试还不成功,你可以尝试下用this.$nextTick。这个问题的本质就是iview没那么聪明,或者说下拉框数据iview只加载一次,所以后续需要我们去进行加载操作。

this.$nextTick(()=>{
    this.rendering = true;
});


  • 文章是个人知识点整理总结,如有错误和不足之处欢迎指正。
  • 如有疑问、或希望与笔者探讨技术问题(包括但不限于本章内容),欢迎添加笔者微信(o815441)。请备注“探讨技术问题”。欢迎交流、一起进步。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/69855.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!