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

yizhihongxing

首先我们需要了解一下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日

相关文章

  • 如何在vue3中使用jsx语法

    下面是在Vue3中使用JSX语法的详细攻略。 什么是JSX JSX是一种JavaScript的语法扩展,允许我们使用类似于HTML的语法来描述应用程序的用户界面(UI),其最初由React提出。JSX简洁易读,可以让我们在JavaScript中创建复杂的UI组件。 在Vue3中,官方也提供了一种使用JSX语法的方式,使得我们可以更加灵活地创建组件。 安装依赖…

    Vue 2023年5月28日
    00
  • vue基础之事件v-onclick=”函数”用法示例

    以下是关于“vue基础之事件v-on:click=’函数’用法示例”的完整攻略。 什么是v-on:click事件 v-on:click是Vue.js中的一个指令,用于DOM元素的点击事件。通过在模板代码中使用该指令,可以方便地为DOM元素添加点击事件,实现交互效果。 基本使用 在Vue.js中,使用v-on:click添加点击事件,需要将代码嵌套在v-on指…

    Vue 2023年5月27日
    00
  • vue 数据遍历筛选 过滤 排序的应用操作

    关于Vue数据的遍历、筛选、过滤以及排序操作,我可以提供如下的完整攻略: 1. 使用v-for进行数据遍历 在Vue中,使用v-for指令可以方便地进行数据遍历,例如: <ul> <li v-for="item in items">{{item}}</li> </ul> 这个例子中,我们使用…

    Vue 2023年5月28日
    00
  • Vue.js的高级面试题(附答案)

    下面我将详细讲解“Vue.js的高级面试题(附答案)”的完整攻略。 一、背景 在Vue.js开发中,面试官通常会问一些高级问题来考察开发者使用Vue.js的深度和广度,因此我们需要掌握一些高级面试题。 二、面试题目及答案 1. Vue.js如何实现组件的懒加载? 答:我们可以使用Vue.js中的异步组件(Syntax Async Components)来实现…

    Vue 2023年5月28日
    00
  • Vue axios 中提交表单数据(含上传文件)

    当我们使用Vue.js和axios时,我们通常需要将表单数据提交到后端交给服务器处理。这包括一些简单的表单数据提交和上传文件. 这里提供一个完整攻略如何使用Vue.js和axios提交表单数据(包含上传文件)。 设置后端服务器接受表单数据和文件 首先,我们需要设置后端服务器接受表单数据和文件,并且返回响应结果。通常情况下,我们会使用一些服务器端框架例如Dja…

    Vue 2023年5月28日
    00
  • vue的组件通讯方法总结大全

    我来为你详细讲解一下“Vue的组件通讯方法总结大全”的完整攻略。 1. 组件通讯方法概述 在Vue的组件化开发中,组件之间的通讯是必不可少的。Vue提供了多种组件通讯方法,包括: 父子组件通讯:父组件通过props向子组件传递数据,子组件通过emit触发事件向父组件传递数据。 兄弟组件通讯:通过一个共同的父组件来实现兄弟组件通讯,即父组件先接收兄弟组件的数据…

    Vue 2023年5月27日
    00
  • vue 获取元素额外生成的data-v-xxx操作

    当Vue渲染一个组件的时候,会自动生成一些指令,如data-v-xxx。这些指令是Vue为了保证组件的封装性、作用域隔离、样式隔离等方面做出的设计。如果应用CSS属性的时候直接写在后代元素上,并且如果后代元素被渲染成为一个组件,这个样式将不会应用到这个后代元素上,导致样式失效。 Vue提供了一些API来获取这些额外生成的data-v-xxx操作,常见的方式有…

    Vue 2023年5月29日
    00
  • Vue Element UI + OSS实现上传文件功能

    下面是“Vue Element UI + OSS实现上传文件功能”的完整攻略。 准备工作 1.安装Vue CLI并创建Vue项目。 2.引入Element UI和Aliyun OSS SDK。 <!– index.html –> <!DOCTYPE html> <html lang="en"> &l…

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