Vue组件之极简的地址选择器的实现

首先我们需要了解一下Vue组件的基本知识。

什么是Vue组件?

Vue 组件是可复用的 Vue 实例,拥有自己的视图和行为。在 Vue 中,组件是基本的代码复用单元,一个页面可以由多个小的组件组成,每个组件封装了自己的代码和模板,可以单独的进行开发、测试和维护。

Vue组件的基本结构

一个 Vue 组件通常由模板、样式和逻辑组成。模板是组件的显示部分,样式是组件的样式部分,逻辑是组件的操作部分。

一个简单的 Vue 组件的结构如下所示:

<!-- 模板 -->
<template>
  <div class="my-component">
    <!-- 组件的显示部分 -->
  </div>
</template>

<!-- 样式 -->
<style scoped>
  .my-component {
    /* 组件的样式部分 */
  }
</style>

<!-- 逻辑 -->
<script>
export default {
  name: 'MyComponent',
  /* 组件的操作部分 */
}
</script>

Vue组件之极简的地址选择器的实现

下面我们以一个极简的地址选择器为例,讲解一下如何实现一个 Vue 组件。

界面设计

我们需要一个输入框,一个展示选择结果的文本框,以及一个省市区三级联动选择框。

<template>
  <div class="address-picker">
    <input type="text" v-model="searchText" placeholder="请输入关键字">
    <div class="choose-result">
      <span v-for="item in chosenList">{{item}} / </span>
    </div>
    <div class="picker-wrapper">
      <div class="picker-item">
        <input type="radio" name="province" v-model="province" :value="item.name" v-for="item in provinceList" :key="item.name">
        <label v-for="item in provinceList" :for="'pro-'+item.id">{{item.name}}</label>
      </div>
      <div class="picker-item">
        <input type="radio" name="city" v-model="city" :value="item.name" v-for="item in filteredCityList" :key="item.name">
        <label v-for="item in filteredCityList" :for="'city-'+item.id">{{item.name}}</label>
      </div>
      <div class="picker-item">
        <input type="radio" name="district" v-model="district" :value="item.name" v-for="item in filteredDistrictList" :key="item.name">
        <label v-for="item in filteredDistrictList" :for="'dis-'+item.id">{{item.name}}</label>
      </div>
    </div>
  </div>
</template>

数据处理

我们需要从服务器获取省市区数据,并且在用户输入关键字时,根据输入的内容来实时过滤数据。

<script>
export default {
  name: 'AddressPicker',
  data () {
    return {
      provinceList: [],
      cityList: [],
      districtList: [],
      province: '',
      city: '',
      district: '',
      searchText: ''
    }
  },
  computed: {
    chosenList () {
      const result = []
      if (this.province) {
        result.push(this.province)
      }
      if (this.city) {
        result.push(this.city)
      }
      if (this.district) {
        result.push(this.district)
      }
      return result
    },
    filteredCityList () {
      if (!this.province) {
        return []
      }
      return this.cityList.filter((item) => {
        return item.province === this.province
      })
    },
    filteredDistrictList () {
      if (!this.city) {
        return []
      }
      return this.districtList.filter((item) => {
        return item.city === this.city
      })
    }
  },
  mounted () {
    this.loadProvinceList()
  },
  methods: {
    loadProvinceList () {
      // 发送请求获取省份列表
      axios.get('/api/province')
        .then(({data}) => {
          this.provinceList = data
        })
    },
    loadCityList (province) {
      // 发送请求获取市列表
      axios.get(`/api/city?province=${province}`)
        .then(({data}) => {
          this.cityList = data
          this.city = ''
        })
    },
    loadDistrictList (city) {
      // 发送请求获取区县列表
      axios.get(`/api/district?city=${city}`)
        .then(({data}) => {
          this.districtList = data
          this.district = ''
        })
    }
  },
  watch: {
    province (newVal, oldVal) {
      if (newVal) {
        this.loadCityList(newVal)
      }
    },
    city (newVal, oldVal) {
      if (newVal) {
        this.loadDistrictList(newVal)
      }
    },
    searchText (newVal, oldVal) {
      // 进行关键字匹配
      // ...
    }
  }
}
</script>

使用组件

最后,在页面上使用该组件即可:

<template>
  <div>
    <p>请选择地址:</p>
    <address-picker></address-picker>
  </div>
</template>

<script>
import AddressPicker from './components/AddressPicker.vue'

export default {
  name: 'App',
  components: {
    AddressPicker
  }
}
</script>

示例说明

  1. 示例一:搜索关键字

用户输入关键字时,我们需要根据关键字来对省市区数据进行过滤。代码实现请参考上面的 watch 属性中的 searchText 方法。

  1. 示例二:三级联动

当用户选择一个省份时,我们需要根据省份来获取城市列表,并且让用户选择一个城市;当用户选择一个城市时,我们需要根据城市来获取区县列表,并且让用户选择一个区县。代码实现请参考上面的 methodswatch 属性中的相关方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue组件之极简的地址选择器的实现 - Python技术站

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

相关文章

  • vue如何搭建多页面多系统应用

    要搭建多页面多系统应用,我们需要考虑以下几个方面: 如何配置webpack多入口 如何分别打包多个页面 如何创建多个vue实例 如何在不同的页面中加载不同的组件 下面我们逐一讲解: 1. 如何配置webpack多入口 我们可以在webpack.config.js中配置entry来指定多个入口文件,示例代码如下: module.exports = { entr…

    Vue 2023年5月28日
    00
  • vue项目中请求数据特别多导致页面卡死的解决

    针对“vue项目中请求数据特别多导致页面卡死的解决”的问题,我们可以采用以下的解决方案: 1. 分页查询 在使用vue进行数据交互过程中,我们可以采用分页查询的方式,将数据进行分段展示,以避免一次性请求数据过多导致页面卡死。在实际开发中,我们可以将数据进行分页处理,控制每次请求的数据量,最终将数据分批渲染到页面上。下面是一个示例的代码: // 数据分页处理 …

    Vue 2023年5月28日
    00
  • Vue组件化(ref,props, mixin,.插件)详解

    接下来我将为大家详细讲解Vue组件化(ref, props, mixin, 插件)的攻略。 什么是Vue组件化 Vue组件是一个可复用的Vue实例,具有接受和渲染数据的能力。组件通常用于构建Web页面中具有可复用的模块化结构的元素,如侧边栏、导航栏、底部栏等。Vue组件化使得Web页面中的HTML元素和JavaScript代码有了更加清晰的分离和组织体系,能…

    Vue 2023年5月28日
    00
  • vue全局过滤器概念及注意事项和基本使用方法

    vue全局过滤器概念及注意事项和基本使用方法 在Vue中,全局过滤器是一个简单的函数,用于将文本转换为更易读的格式。全局过滤器可以用于处理日期格式、价格格式、将字符串转换为小写等多种情况。全局过滤器可以在任何Vue组件的模板中使用。 注意事项 在使用全局过滤器时,需要注意以下几点: 全局过滤器一旦定义,就可以在整个应用程序中使用。因此,需要在定义全局过滤器时…

    Vue 2023年5月27日
    00
  • vue如何将v-for中的表格导出来

    当我们在使用Vue的v-for指令来动态渲染表格时,如何将表格导出成Excel或CSV文件呢?下面就是详细的攻略。 步骤一:安装依赖库 在Vue项目中,我们需要使用js-xlsx和file-saver这两个库来实现导出表格功能。 npm install file-saver xlsx -S 步骤二:定义数据和表头 在Vue组件中,我们需要定义要导出的数据和表…

    Vue 2023年5月28日
    00
  • vue-cli3访问public文件夹静态资源报错的解决方式

    当我们使用Vue.js进行项目开发时,通常需要访问public文件夹中存放的一些静态资源,例如图片、音视频等。但是,有时我们在进行开发时可能会遇到访问public文件夹静态资源时报错的情况,如何解决呢?本文将为你详细讲解。 问题分析 在vue-cli3中,开发环境下引用相对路径的静态资源是没有问题的,但是当我们使用build之后的代码时,引用相对路径的静态资…

    Vue 2023年5月28日
    00
  • Vue.js教程之计算属性

    让我来为你详细讲解一下“Vue.js教程之计算属性”的完整攻略。 什么是计算属性? 在 Vue.js 中,计算属性(Computed)是一种在模板中使用的属性,通过计算属性我们可以实现一些动态的内容展示或逻辑处理,并且相较于使用方法或侦听器等方式,计算属性的实现更为简便、高效。 我们可以在 Vue 实例中使用 computed 属性来定义计算属性,该属性是一…

    Vue 2023年5月27日
    00
  • vue DatePicker日期选择器时差8小时问题

    接下来我将为您提供关于“vue DatePicker日期选择器时差8小时问题”的完整攻略。 首先,需要明确的是,这个问题的根本原因是由于本地时间的时差问题。当我们在使用 Date 或者 moment.js 类库进行日期操作时,其默认取的时间是当前系统的本地时间。而我们所使用的 vue DatePicker 组件却显示的是 GMT 时间,因此就会产生 8 小时…

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