Laravel Vue 下拉框联动小技巧

最近在做一个后台管理相关的东西,有一个关于下拉框联动的小技巧可以分享给大家,写好后不用更改前端代码,只需更改后端相应的配置,即可增加相对应的联动。

比如有两个下拉框一个省和一个市的下拉框,这里只是拿省市打个比方,两个元素是相互依赖的关系,方便理解,并不是要做省市区的三级联动,当然也可以做。

demo

1 用户模型定义相关参数


class User
{
    const PROVINCE_BEIJING = 'geijing';
    const PROVINCE_SHANGHAI = 'shanghai';
    public static $provinceMaps = [
        self::PROVINCE_BEIJING=>'北京',
        self::PROVINCE_SHANGHAI=>'上海'
    ];

    const CITY_DONGCHENG='dongcheng';
    const CITY_ZHAOYANG='zhaoyang';
    const CITY_PUDONG='pudong';
    const CITY_BAOSHAN='baoshan';

    public static $cityMaps=[
        self::CITY_DONGCHENG=>'东城区',
        self::CITY_ZHAOYANG=>'朝阳区',
        self::CITY_PUDONG=>'浦东新区',
        self::CITY_BAOSHAN=>'宝山区',
    ];

    //省市联动配置
    public static $cityByProvinceMaps=[
        self::PROVINCE_BEIJING=>[
            self::CITY_DONGCHENG=>'东城区',
            self::CITY_ZHAOYANG=>'朝阳区',
        ],
        self::PROVINCE_SHANGHAI=>[
            self::CITY_PUDONG=>'浦东新区',
            self::CITY_BAOSHAN=>'宝山区'
        ]
    ];

}

2 获取定义的参数

获取方法

function getMModelMaps($classes)
{
    $map = [];
    foreach ($classes as $class){
        $ref = new \ReflectionClass($class);
        $className = $ref->getShortName();
        $constants = $ref->getConstants();
        $staticProperties = $ref->getStaticProperties();
        $onlyMapsProperties = [];
        foreach ($staticProperties as $key=>$v){
            if(strpos($key,'Maps') !== false){
                $onlyMapsProperties[$key] = $v;
            }
        }
        $map[$className]= array_merge($constants,$onlyMapsProperties);
    }

    return $map;
}

$maps= getMModelMaps([User::class]);

运行转化为json的结果

{
    "User": {
        "PROVINCE_BEIJING": "beijing",
        "PROVINCE_SHANGHAI": "shanghai",
        "CITY_DONGCHENG": "dongcheng",
        "CITY_ZHAOYANG": "zhaoyang",
        "CITY_PUDONG": "pudong",
        "CITY_BAOSHAN": "baoshan",
        "provinceMaps": {
            "beijing": "北京",
            "shanghai": "上海"
        },
        "cityMaps": {
            "dongcheng": "东城区",
            "zhaoyang": "朝阳区",
            "pudong": "浦东新区",
            "baoshan": "宝山区"
        },
        "cityByProvinceMaps": {
            "beijing": {
                "dongcheng": "东城区",
                "zhaoyang": "朝阳区"
            },
            "shanghai": {
                "pudong": "浦东新区",
                "baoshan": "宝山区"
            }
        }
    }
}

3 传到前端展示

使用的是laravelblade 模版


<div id="app">
    <select name=""  v-model="province">
        <option value="">请选择省</option>
        <option v-for="(name,key) in provinceMaps" :value="key">@{{name}}</option>
    </select>
    <select  v-model="city">
        <option value="">请选择市</option>
        <option v-for="(name,key) in cityMaps" :value="key">@{{name}}</option>

    </select>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            province:'',
            city:'',
            maps:@json($maps),
            provinceMaps:@json($maps).User.provinceMaps,
            cityMaps:@json($maps).User.cityMaps,
        },
        watch:{
            province(val){
                this.city=''
                this.cityMaps=this.maps.User.cityByProvinceMaps[val]
            },
            city(val){
                if(val){
                    if(!this.province){
                        this.city=''
                        alert('请先选择省')
                    }
                }
            }
        }
    })
</script>

4 增加联动配置

比如想增加个天津的配置

User增加配置即可,不用更改前端代码

本作品采用《CC 协议》,转载必须注明作者和本文链接
Make everything simple instead of making difficulties as simple as possible
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!