<template> <div class="wrap"> <template v-if="ready"> <div class="filter"> <select v-model="selected"> <option v-for="op in types" :value="op.id" :key="op.id">{{ op.option }}</option> </select> <button @click="handleSearch">查询</button> </div> <Modules :data="modulesData" :loading="modulesLoading" /> </template> <template v-else> <p>加载中...</p> </template> </div> </template> <script> const mock = api => { return new Promise((reslove) => { const callback = data => { setTimeout(() => { reslove.apply(this, [data]) }, 1200); } switch (api) { case '/types': callback([ { id: 100, option: '北京' }, { id: 200, option: '天津' }, ]) break; case '/modules': callback( Array( Math.ceil( 10 * Math.random() ) ).fill(null).map( (d, i) => Math.random() ) ) default: break; } }) } const Modules = { props: ['data', 'loading'], render() { const { data, loading } = this.$props; if (loading) { return ( <div class="loading">加载中...</div> ) } if (data && data.length > 0) { return ( <div class="modules"> { data.map( d => <p>data - { d }</p> ) } </div> ) } else { return ( <div class="no-data">暂无数据</div> ) } } } export default { data: () => ({ ready: false, types: [], selected: -1, modulesLoading: false, modulesData: [] }), components: { Modules }, methods: { init() { mock('/types').then( data => { this.types = data; if (data.length > 0) { this.selected = data[0].id; this.getModules(); } this.ready = true; } ) }, getModules() { this.modulesLoading = true; mock( '/modules' ).then( data => { this.modulesData = data; } ).finally(() => { this.modulesLoading = false; }) }, handleSearch(id) { this.getModules(); }, }, mounted() { this.init() }, } </script>