IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> el-select下拉框没有数据 -> 正文阅读

[JavaScript知识库]el-select下拉框没有数据

目录

一、问题

二、问题详细描述

?三、解决方法

四、总结


一、问题

1.突然发现给options赋值了,但是下拉框没有数据,就很奇怪。

二、问题详细描述

1.直接用假数据(手动添加的数据)赋值给options,下拉框中的数据正常显示。

? 1)代码如下:

<template>
    <template v-for="(contentItem, contentKey) of content">
      <el-select
        v-model="contentItem.value"
        :key="contentKey"
        placeholder="请选择人员"
      >
        <el-option
          v-for="(item, itemKey) of contentItem.options"
          :key="itemKey"
          :value="item[contentItem.matchKey]"
          :lable="item[contentItem.matchKey]"
        >
          <span>{{ item[contentItem.matchKey] }}</span>
          <span>{{ item[contentItem.lable] }}</span>
        </el-option>
      </el-select>
    </template>
</template>
<script>
export default {
  data() {
    return {
      //下拉框数据
      content: {
        person: {
          value: "",
          matchKey: "name",
          type: "select",
        },
      },
    },
   },
   mounted(){
      this.initData();
      this.content.person.value = "奇怪的事情";
   },
   methods:{
   initData(){
       this.getPerson();
    },
    //获取用户
    getPerson() {
      console.log("person---get");
      this.content.person.options = {
        0: {
          name: "小明",
          id: "01",
        },
        1: {
          name: "小华",
          id: "02",
        },
        2: {
          name: "小青",
          id: "1000000000000001",
        },
      };
   }
}
</script>

? 2)效果如图1所示

图 1

2.调用接口添加数据

? ?1)代码如下:

??

<template>
    <template v-for="(contentItem, contentKey) of content">
      <el-select
        v-model="contentItem.value"
        :key="contentKey"
        placeholder="请选择人员"
      >
        <el-option
          v-for="(item, itemKey) of contentItem.options"
          :key="itemKey"
          :value="item[contentItem.matchKey]"
          :lable="item[contentItem.matchKey]"
        >
          <span>{{ item[contentItem.matchKey] }}</span>
          <span>{{ item[contentItem.lable] }}</span>
        </el-option>
      </el-select>
    </template>
</template>
<script>
import { _findPacuDoctorList } from "@/api/implemenceAPI";
export default {
  data() {
    return {
      //下拉框数据
      content: {
        person: {
          value: "",
          matchKey: "name",
          type: "select",
        },
      },
    },
  }
   mounted(){
      this.initData();
      this.content.person.value = "奇怪的事情";
   },
   methods:{
   initData(){
       this.getPerson();
    },
    //获取用户
    getPerson() {
      console.log("person---get");
      let params = {
        data: {
          type: 4,
          name: typeof inputContent === "string" ? inputContent : "",
        },
        size: "100",
        sortBy: "name",
      };
      _findPacuDoctorList(params)
        .then((result) => {
          if (result.status === 200) {
            console.log("result", result);
            this.content.person.options = result.data.content;
          }
        })
        .catch((error) => {
          console.log("error", error);
        });
   }
}
</script>

? ?2)效果如图2所示:

? ? 调用了接口,并且有数据返回,但是? ?下拉框中没有数据

图 2

3.百思不得其解呀,明明就是类似的东西,只是一个是直接赋值,一个是调接口赋值而已,怎么会这样呢?

1)更奇葩的是我想复现上述1、2所示的情况时,发现1无法复现---即直接赋值也会?导致图2的效果,下拉框无数据。

a.仔细对比后,发现上述1所示现象的前提条件是?给下拉框数据options赋值前,对该下拉框出现的值?提前赋初始值(如代码1中mounted函数中的:? ? ? this.content.person.value = "奇怪的事情";
)

b.若删除代码1中的?? ? ? this.content.person.value = "奇怪的事情";则会发现下拉框? 如图2?所示,下拉框中没有数据

4.更神奇的事情,若?代码1和代码2合并,即先用假数据给options赋值,再用接口获取数据给options赋值。则会导致第一次点击下拉框数据是:假数据,并选中一个选项,如图3所示;之后点击下拉框数据是:调用接口获取的数据,如图4所示。

图 3?第一次点击下拉框并选中一个数据

图 4?之后点击下拉框

?三、解决方法

1.仔细检查才发现,上面的奇葩现象是因为我声明? data时? 没有添加 options属性。options属性不是响应式的。

? ? 如? 二、问题详细描述 , 4中描述的情况:在mount时已经给 person赋值,data初始化完毕,第一次选择的时候,先用假数据给options赋值,下拉框有了数据,接着异步调用接口给options重新赋值,但因为options是非响应式的,没有更新。选择一个选项,触发点击事件的同时,还触发了 updatePopper事件,更新了下拉框的值.所以之后点击下拉框数据都是?调用接口返回的数据

图 5?执行点击事件后,最后执行了? updatePopper

  data() {
    return {
      //下拉框数据
      content: {
        person: {
          value: "",
          matchKey: "name",
          type: "select",
        },
      },
    },
   },

2.在data中添加 options属性即可: options:[]

  data() {
    return {
      //下拉框数据
      content: {
        person: {
          value: "",
          matchKey: "name",
          type: "select",
          options:[],
        },
      },
    },
   },

?上述所述的奇葩问题都没有了。

? 1)直接用假数据赋值,下拉框有值

? 2)直接用接口返回值赋值,下拉框有值

? 3)先用假数据赋值,再用接口返回值赋值,下拉框有值(接口返回值)

四、总结

1.赋值后下拉框不显示数据,或下拉框数据需要先执行点击操作等才被更新等情况,请仔细检查 options是否在 data中声明过(是否是响应式的)。

2.以上是自己在写代码中踩得坑,之前也有一直看到响应式有关的内容,但并没有真正get到。这次算是认识了一点点。

/*

希望对你有帮助!

如有错误,欢迎指正!非常感谢!

*/

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:27:56  更:2022-03-22 20:30:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:36:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码