Element-UI中回显失败问题的完美解决

yizhihongxing

当我们在使用 Element-UI 中的级联选择器(Cascader)组件时,有时会遇到回显失败的问题,导致选择的值无法正确显示在界面上。这个问题的解决方式有多种,下面我们来详细介绍一种完美解决方案。

问题现象

在使用 Element-UI 的级联选择器组件时,有时候我们需要在修改页面中回显已经选择过的值。这时候,我们可以使用v-model绑定父子组件的选中值,但是当选中的值比较复杂时,我们可能会遇到回显失败的问题。

比如我们有如下的一个选项列表:

options: [
  {
    value: 'beijing',
    label: '北京',
    children: [
      {
        value: 'chaoyang',
        label: '朝阳区',
        children: [
          {
            value: 'taiyanggong',
            label: '太阳宫'
          }
        ]
      },
      {
        value: 'haidian',
        label: '海淀区',
        children: [
          {
            value: 'wudaokou',
            label: '五道口'
          },
          {
            value: 'zhongguancun',
            label: '中关村'
          }
        ]
      }
    ]
  }
]

我们通过父子组件间的绑定,在父组件中将选中的值存储在value中,然后再通过v-model与子组件进行双向绑定。

<template>
  <el-cascader
    v-model="value"
    :options="options"
    :props="props"/>
</template>

这样,当我们选择了 北京-海淀区-中关村 时,value的值为['beijing', 'haidian', 'zhongguancun'],同时级联选择组件也正确地显示了选择的值。

但是当我们将已经选择好的值传入组件中时,发现级联选择器的选项不会跟随传入的value更新。这个问题具体表现为,如果我们传入的value值为['beijing', 'haidian'],虽然在组件的value中正确地得到了存储,但是在界面上,北京已经被选中,但是海淀区未被选中。

完美解决方案

为了解决这个问题,我们需要引入 Element-UI 中的opts参数。opts是一个包含多个属性的对象,其中emitPathlazy属性是我们需要关注的重点。

在我们正常使用级联选择器时,emitPathlazy属性默认是忽略的。这就导致当我们传入一段选中值数组[value1, value2, ..., valueN]时,组件无法判断这些选中值与级联选择器的选项之间的正确映射关系,导致回显失败。

为了解决这个问题,我们需要手动设置opts参数:

<template>
  <el-cascader
    v-model="value"
    :options="options"
    :props="props"
    :opts="opts"/>
</template>

同时我们还需要为这个 opts 对象提供正确的值:

opts: {
  emitPath: false,
  lazy: true
},
  • emitPath是控制级联选择器与外部应用之间数据交互的一个属性。当该值被赋值为true时,父组件向子组件传值时会传递一个经过处理的路径数组,而不是单纯的选中值数组。这种传值的方式可以让级联选择器更好地与我们的应用进行交互。
  • lazy是控制级联选择器懒加载选项的一个属性。开启该属性后,级联选择器在加载选项时,只会加载当前展示选项及其子选项,而不是一次性加载全部选项,减轻了前端的数据压力。

最终,我们只需要在传入选中值时提供正确的映射路径即可。比如我们要回显['beijing', 'haidian', 'zhongguancun'],我们需要这样传值:

<template>
  <el-cascader
    v-model="value"
    :options="options"
    :props="props"
    :opts="opts"
    :value="['beijing', 'haidian', 'zhongguancun']"
    />
</template>

这样设置后,就可以正确地将已经选好的值在界面上显示出来了。同时,我们还可以通过传入动态的路径数组,来动态地更新级联选择器的选中值。比如当我们重新选中了['beijing', 'haidian']时,界面上就会正确地显示出北京-海淀区这个选项。

示例说明

下面分别是传入数组格式错误和传入数组格式正确的例子,来进一步说明这个问题。

示例 1:传入数组格式错误

在这个示例中,我们通过修改父组件中的value属性,将选中值变成了一个普通数组,而不是一个经过处理的路径数组。这样就导致了选中值无法正确回显。

<template>
  <el-cascader
    v-model="value"
    :options="options"
    :props="props"
    :opts="opts"
    />
  <button @click="changeValue()">改变选中值</button>
</template>
export default {
  data() {
    return {
      value: ['beijing', 'haidian', 'zhongguancun'],
      options: [
        {...}
      ],
      props: {
        value: 'value',
        label: 'label',
        children: 'children'
      },
      opts: {
        emitPath: false,
        lazy: true
      }
    };
  },
  methods: {
    changeValue() {
      this.value = ['beijing', 'haidian', 'wudaokou'];
    }
  }
}

此时,在点击“改变选中值”按钮后,界面上只有北京会被选中,海淀区五道口没有被选中。

示例 2:传入数组格式正确

在这个示例中,我们正确地使用了经过处理的路径数组。这样,即使曾经选中的值非常复杂,也能正确地回显在界面上。

<template>
  <el-cascader
    v-model="value"
    :options="options"
    :props="props"
    :opts="opts"
    :value="['beijing', 'haidian', 'zhongguancun']"
    />
  <button @click="changeValue()">改变选中值</button>
</template>
export default {
  data() {
    return {
      value: [],
      options: [
        {...}
      ],
      props: {
        value: 'value',
        label: 'label',
        children: 'children'
      },
      opts: {
        emitPath: false,
        lazy: true
      }
    };
  },
  methods: {
    changeValue() {
      this.value = ['beijing', 'haidian', 'wudaokou'];
    }
  }
}

此时,在点击“改变选中值”按钮后,界面上会正确选中北京-海淀区-五道口这个选项。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Element-UI中回显失败问题的完美解决 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue 嵌套路由使用总结(推荐)

    Vue 嵌套路由使用总结(推荐)攻略 什么是嵌套路由? 在 Vue 路由中,嵌套路由就是将多个组件的路由嵌套在一起,形成一个组件树结构。父路由对应的组件内部有子路由对应的组件,子路由对应的组件内部又可以嵌套更深层的路由和组件。在一个页面内,使用嵌套路由可以实现多级导航和页面切换的功能。 如何使用嵌套路由? 1. 定义父路由和子路由 在路由配置中,我们需要定义…

    Vue 2023年5月27日
    00
  • vue深度优先遍历多层数组对象方式(相当于多棵树、三级树)

    如何进行vue深度优先遍历多层数组对象方式 (相当于多棵树、三级树)?下面我们将提供一份完整的攻略。 首先需要明确的是,在vue中,深度遍历多层对象和树的方法都是使用递归的方式完成。以下是深度遍历多层对象的一般实现方法: function deepTraversal(obj, callback) { for (let key in obj) { if (ob…

    Vue 2023年5月27日
    00
  • vue3 reactive函数用法实战教程

    下面是对“vue3 reactive函数用法实战教程”的详细讲解。 什么是vue3 reactive函数? reactive 是 Vue 3 中新引入的一个 API,用于创建响应式对象。通过 reactive 创建出来的对象,在其属性值发生改变时,会自动触发所依赖的组件进行更新。 reactive 函数怎么用? 使用 reactive 可以将一个普通的 Ja…

    Vue 2023年5月28日
    00
  • vue中优雅实现数字递增特效的详细过程

    下面我将详细讲解“Vue中优雅实现数字递增特效的详细过程”。 步骤一:安装插件 Vue中实现数字递增特效需要使用一个叫vue-countup-v2的插件,这个插件可以实现数字的缓动、格式化等功能。我们可以通过npm安装这个插件,在命令行中输入以下命令: npm install –save vue-countup-v2 步骤二:注册组件 在我们使用这个插件之…

    Vue 2023年5月28日
    00
  • Vue中通过Vue.extend动态创建实例的方法

    让我来为您讲解一下在Vue中通过Vue.extend动态创建实例的方法。 Vue.extend方法 Vue.extend方法是Vue的一个全局API,用于创建一个Vue组件构造器,并返回该构造器。通过Vue.extend方法创建的组件构造器可以像普通的Vue组件一样进行注册、传值、生命周期等操作。 创建Vue组件构造器 首先我们需要通过Vue.extend方…

    Vue 2023年5月28日
    00
  • 关于vue设置环境变量全流程

    下面详细介绍关于Vue设置环境变量的全流程。 什么是环境变量 在计算机中,环境变量是一组设置在操作系统中的变量,用于指定操作系统或正在运行的程序所需的特定信息。在Vue.js中,我们通常使用环境变量来指定不同环境下的配置信息,例如:开发环境下的API接口地址和生产环境下的API接口地址等。 设置环境变量 配置方式一:使用dotenv dotenv是一个非常方…

    Vue 2023年5月28日
    00
  • 使用Vuex实现一个笔记应用的方法

    使用Vuex实现一个笔记应用的方法可以分为以下几个步骤: 步骤1: 安装Vuex 首先需要安装Vuex,可以使用npm命令进行安装。 npm install vuex –save 步骤2: 创建Vuex Store 创建一个store.js文件,并将Vuex引入。 import Vuex from ‘vuex’ Vue.use(Vuex) const st…

    Vue 2023年5月29日
    00
  • vue自定义指令实现方法详解

    你要了解关于“vue自定义指令实现方法”的详细攻略,下面为你详细讲解。 什么是Vue自定义指令? 在Vue中,自定义指令是一种用来扩展标准的HTML指令的一种方式。除了内置的$v-cloak指令,Vue还允许注册自定义指令,使开发者可以在模板中直接使用自定义的指令。 Vue自定义指令的注册 定义一个全局自定义指令的方式: Vue.directive(‘my-…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部