Commit 394faf94ee9d9f156f39606f1dcecb99443675b1

Authored by 刘汉宸
1 parent 52a3208c

docs: 更新开发文档

examples/main.js
@@ -13,8 +13,10 @@ import '@/styles/highlight.scss'; @@ -13,8 +13,10 @@ import '@/styles/highlight.scss';
13 import '@/assets/iconfont/iconfont.css'; 13 import '@/assets/iconfont/iconfont.css';
14 import '@/mixins/page.scss'; 14 import '@/mixins/page.scss';
15 import MIX_PAGE from '@/mixins/page.js'; 15 import MIX_PAGE from '@/mixins/page.js';
  16 +import MIX_ORIGIN from '@/mixins/origin';
16 17
17 window.MIX_PAGE = MIX_PAGE; 18 window.MIX_PAGE = MIX_PAGE;
  19 +window.MIX_ORIGIN = MIX_ORIGIN;
18 20
19 // 进度条配置 21 // 进度条配置
20 NProgress.configure({ showSpinner: false }); 22 NProgress.configure({ showSpinner: false });
examples/mixins/page.js
@@ -4,7 +4,7 @@ export default { @@ -4,7 +4,7 @@ export default {
4 mixins: [MIX_ORIGIN], 4 mixins: [MIX_ORIGIN],
5 data() { 5 data() {
6 return { 6 return {
7 - auto: true, // 页面加载时自动查询 7 + auto: false, // 页面加载时自动查询
8 tableData: [], // 表格数据 8 tableData: [], // 表格数据
9 loading: false, // 加载状态 9 loading: false, // 加载状态
10 total: 0, // 数据总量 10 total: 0, // 数据总量
examples/router/routes.js
@@ -122,6 +122,23 @@ const _develops = [ @@ -122,6 +122,23 @@ const _develops = [
122 meta: { title: 'Mixin Page 标准页' }, 122 meta: { title: 'Mixin Page 标准页' },
123 component: () => import('@/views/docs/develop/mixin/page.md'), 123 component: () => import('@/views/docs/develop/mixin/page.md'),
124 }, 124 },
  125 + {
  126 + path: 'orgin',
  127 + name: 'orgin',
  128 + meta: { title: 'Mixin Orgin 初始值' },
  129 + component: () => import('@/views/docs/develop/mixin/origin.md'),
  130 + },
  131 + ],
  132 + },
  133 + {
  134 + group: '方案开发',
  135 + children: [
  136 + {
  137 + path: 'scheme',
  138 + name: 'developScheme',
  139 + meta: { title: 'Scheme 方案' },
  140 + component: () => import('@/views/docs/develop/scheme/scheme.md'),
  141 + },
125 ], 142 ],
126 }, 143 },
127 ]; 144 ];
examples/views/docs/component/select.md
@@ -455,6 +455,111 @@ export default { @@ -455,6 +455,111 @@ export default {
455 455
456 ::: 456 :::
457 457
  458 +## 可创建新条目
  459 +
  460 +设置`allow-create`和`filterable`允许创建新的选项,输入内容后可以直接选择已输入的内容
  461 +
  462 +<div class="code-snippet-box">
  463 +
  464 +::: snippet 单选示例
  465 +
  466 +```html
  467 +<template>
  468 + <div>
  469 + <z-select v-model="model" allow-create filterable>
  470 + <el-option label="单车" value="VAN">单车</el-option>
  471 + <el-option label="牵引车" value="TRACTOR">牵引车</el-option>
  472 + </z-select>
  473 + <span>{{ model }}</span>
  474 + </div>
  475 +</template>
  476 +
  477 +<script>
  478 +export default {
  479 + data() {
  480 + return {
  481 + model: '',
  482 + }
  483 + }
  484 +}
  485 +</script>
  486 +```
  487 +
  488 +:::
  489 +
  490 +::: snippet 多选示例
  491 +
  492 +```html
  493 +<template>
  494 + <div>
  495 + <z-select v-model="model" multiple allow-create filterable>
  496 + <el-option label="单车" value="VAN">单车</el-option>
  497 + <el-option label="牵引车" value="TRACTOR">牵引车</el-option>
  498 + </z-select>
  499 + <span>{{ model }}</span>
  500 + </div>
  501 +</template>
  502 +
  503 +<script>
  504 +export default {
  505 + data() {
  506 + return {
  507 + model: '',
  508 + }
  509 + }
  510 +}
  511 +</script>
  512 +```
  513 +
  514 +:::
  515 +
  516 +</div>
  517 +
  518 +<div class="code-snippet-box">
  519 +
  520 +::: snippet 远程示例,输入创建的新项为临时项,选中后再次下拉时不会包括在选项结果中
  521 +
  522 +```html
  523 +<template>
  524 + <div>
  525 + <z-select v-model="model" :options="options" :queryApi="queryAPI" allow-create filterable></z-select>
  526 + <span>{{ model }}</span>
  527 + </div>
  528 +</template>
  529 +
  530 +<script>
  531 +export default {
  532 + data() {
  533 + return {
  534 + model: '',
  535 + options: [
  536 + { label: '王七', value: 'wq' },
  537 + { label: '陈拾', value: 'cs' },
  538 + ]
  539 + }
  540 + },
  541 + methods: {
  542 + queryAPI(val) {
  543 + return new Promise(resolve => {
  544 + setTimeout(() => {
  545 + resolve({
  546 + result: [
  547 + { label: '王五', value: 'ww' },
  548 + { label: '赵六', value: 'zl' },
  549 + ]
  550 + });
  551 + }, 1000);
  552 + });
  553 + },
  554 + }
  555 +}
  556 +</script>
  557 +```
  558 +
  559 +:::
  560 +
  561 +</div>
  562 +
458 ## API 563 ## API
459 564
460 ## Attribute 属性 565 ## Attribute 属性
examples/views/docs/develop/mixin/origin.md 0 → 100644
@@ -0,0 +1,43 @@ @@ -0,0 +1,43 @@
  1 +# Mixin Origin 初始值
  2 +
  3 +常用Vue页面初始值的混入配置
  4 +
  5 +## 基础用法
  6 +
  7 +`MIX_ORIGIN`混入配置项,会默认记录当前页面初始值。
  8 +
  9 +::: snippet `originData`表示当前页面的初始data值,`getOriginData`方法可获得一个新的初始值对象
  10 +
  11 +```html
  12 +<template>
  13 + <div>
  14 + <div>model初始值:{{ originData.model }}</div>
  15 + <el-input v-model="model.name" size="mini" style="width: 200px; margin: 10px 0"></el-input>
  16 + <el-button type="primary" size="mini" @click="handleReset">重置</el-button>
  17 + <div>model当前值:{{ model }}</div>
  18 + </div>
  19 +</template>
  20 +
  21 +<script>
  22 +// import MIX_ORIGIN from '@/mixins/origin'; 注:使用时解除此注释
  23 +
  24 +export default {
  25 + mixins: [MIX_ORIGIN],
  26 + data() {
  27 + return {
  28 + model: {
  29 + name: '张三',
  30 + },
  31 + };
  32 + },
  33 + methods: {
  34 + handleReset() {
  35 + // 注意:切记不可写成 this.model = this.originData.model; 否则会导致originData被改变!
  36 + this.model = this.getOriginData().model;
  37 + }
  38 + },
  39 +};
  40 +</script>
  41 +```
  42 +
  43 +:::
examples/views/docs/develop/mixin/page.md
1 # Mixin Page 标准页 1 # Mixin Page 标准页
2 2
3 -根据JSON Scheme配置自动生成一个筛选条件表单 3 +常规分页逻辑的混入配置
4 4
5 ## 基础用法 5 ## 基础用法
6 6
@@ -51,31 +51,12 @@ export default { @@ -51,31 +51,12 @@ export default {
51 searchModel: { 51 searchModel: {
52 name: '', 52 name: '',
53 }, 53 },
  54 + tableData: [
  55 + { id: '0', name: '李饼', age: 32 },
  56 + { id: '1', name: '陈拾', age: 20 },
  57 + ],
54 }; 58 };
55 }, 59 },
56 - methods: {  
57 - searchAPI(params) {  
58 - return new Promise(resolve => {  
59 - setTimeout(() => {  
60 - const source = [  
61 - { id: '0', name: '李饼', age: 32 },  
62 - { id: '1', name: '陈拾', age: 20 },  
63 - { id: '3', name: '王七', age: 26 },  
64 - { id: '4', name: '崔倍', age: 27 },  
65 - { id: '5', name: '孙豹', age: 38 },  
66 - { id: '6', name: '庞柏', age: 42 },  
67 - { id: '7', name: '蔡疏', age: 60 },  
68 - { id: '8', name: '卢纳', age: 55 },  
69 - ];  
70 - const list = source.filter(item => `${item.name}`.includes(params.name));  
71 - resolve({  
72 - result: list,  
73 - totalCount: list.length  
74 - });  
75 - }, 1500);  
76 - });  
77 - },  
78 - },  
79 }; 60 };
80 </script> 61 </script>
81 62
@@ -123,6 +104,7 @@ export default { @@ -123,6 +104,7 @@ export default {
123 mixins: [MIX_PAGE], 104 mixins: [MIX_PAGE],
124 data() { 105 data() {
125 return { 106 return {
  107 + auto: true,
126 searchModel: { 108 searchModel: {
127 name: '', 109 name: '',
128 }, 110 },
@@ -147,7 +129,7 @@ export default { @@ -147,7 +129,7 @@ export default {
147 result: list, 129 result: list,
148 totalCount: list.length 130 totalCount: list.length
149 }); 131 });
150 - }, 1500); 132 + }, 500);
151 }); 133 });
152 }, 134 },
153 }, 135 },
@@ -158,174 +140,151 @@ export default { @@ -158,174 +140,151 @@ export default {
158 140
159 ::: 141 :::
160 142
161 -## 内置方法 143 +## 弹出框表单
162 144
163 -本混入配置中,内置了`originData`对象和`getOriginData`方法。 145 +常用的弹出框表单提交示例
164 146
165 -::: snippet `originData`表示当前页面的初始data值,`getOriginData`方法可获得一个新的初始值对象 147 +::: snippet 新增修改共用表单示例
166 148
167 ```html 149 ```html
168 <template> 150 <template>
169 <div> 151 <div>
170 - <div>model初始值:{{ originData.model }}</div>  
171 - <el-input v-model="model.name" size="mini" style="width: 200px; margin: 10px 0"></el-input>  
172 - <el-button type="primary" size="mini" @click="handleReset">重置</el-button>  
173 - <div>model当前值:{{ model }}</div> 152 + <div class="page-search">
  153 + <z-form :model="searchModel" label-width="80px" size="small" span="6">
  154 + <z-form-item label="姓名" prop="name">
  155 + <el-input v-model="searchModel.name"></el-input>
  156 + </z-form-item>
  157 + <z-form-item span="18" style="text-align: right">
  158 + <el-button-group>
  159 + <el-button :loading="loading" type="primary" @click="onSearch">查询</el-button>
  160 + <el-button @click="onReset">重置</el-button>
  161 + </el-button-group>
  162 + </z-form-item>
  163 + </z-form>
  164 + </div>
  165 + <div class="page-action">
  166 + <el-button type="primary" size="small" @click="openNew">新增</el-button>
  167 + </div>
  168 + <z-table class="page-table" v-loading="loading" v-bind="tableProps">
  169 + <el-table-column prop="name" label="姓名"></el-table-column>
  170 + <el-table-column prop="age" label="年龄"></el-table-column>
  171 + <el-table-column label="操作" width="80">
  172 + <template #default="{ row, $index }">
  173 + <el-button size="mini" type="text" title="编辑" @click="openEdit({ row, index: $index })">编辑</el-button>
  174 + </template>
  175 + </el-table-column>
  176 + </z-table>
  177 + <el-pagination class="page-pagination" v-bind="paginationProps" v-on="paginationEvent"></el-pagination>
  178 + <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="400px" @closed="resetForm">
  179 + <z-form ref="form" :model="form" :rules="formRules" label-width="60px" size="small">
  180 + <z-form-item label="姓名" prop="name">
  181 + <el-input v-model="form.name"></el-input>
  182 + </z-form-item>
  183 + <z-form-item label="年龄" prop="age">
  184 + <el-input v-model="form.age"></el-input>
  185 + </z-form-item>
  186 + <z-form-item>
  187 + <el-button type="primary" :loading="submitting" @click="onSubmit">确定</el-button>
  188 + <el-button @click="onCancel">取消</el-button>
  189 + </z-form-item>
  190 + </z-form>
  191 + </el-dialog>
174 </div> 192 </div>
175 </template> 193 </template>
176 194
177 <script> 195 <script>
  196 +// import MIX_PAGE from '@/mixins/page'; 注:使用时解除此注释
  197 +
178 export default { 198 export default {
179 mixins: [MIX_PAGE], 199 mixins: [MIX_PAGE],
180 data() { 200 data() {
181 return { 201 return {
182 - model: {  
183 - name: '张三', 202 + auto: true,
  203 + searchModel: {
  204 + name: '',
184 }, 205 },
185 - };  
186 - },  
187 - methods: {  
188 - handleReset() {  
189 - // 注意:切记不可写成 this.model = this.originData.model; 否则会导致originData被改变!  
190 - this.model = this.getOriginData().model;  
191 - }  
192 - },  
193 -};  
194 -</script>  
195 -```  
196 -  
197 -:::  
198 -  
199 -## 源文件  
200 -  
201 -```js  
202 -import MIX_ORIGIN from '@/mixins/origin'; // 初始值逻辑混入  
203 -  
204 -export default {  
205 - mixins: [MIX_ORIGIN],  
206 - data() {  
207 - return {  
208 - auto: true, // 页面加载时自动查询  
209 - tableData: [], // 表格数据  
210 - loading: false, // 加载状态  
211 - total: 0, // 数据总量  
212 - currentPage: 1, // 当前页码  
213 - pageSize: 10, // 分页大小  
214 - pageSizes: [10, 20, 50, 100], // 分页大小选项  
215 - layout: 'total, sizes, prev, pager, next, jumper', // 分页器默认设置  
216 - searchModel: {}, // 搜索表单绑定值  
217 - form: {}, // 常规表单绑定值  
218 - submitting: false, // 提交状态  
219 - selection: [], // 表格选中项  
220 - collapsed: false, // 展开状态 206 + form: {
  207 + id: '',
  208 + name: '',
  209 + age: '',
  210 + },
  211 + formRules: {
  212 + name: [{ required: true, message: '请输入姓名' }]
  213 + },
  214 + dialogVisible: false,
  215 + dialogMode: 'new',
221 }; 216 };
222 }, 217 },
223 computed: { 218 computed: {
224 - // 搜索栏折叠按钮文本  
225 - toggleText() {  
226 - return this.collapsed ? '收起' : '展开';  
227 - },  
228 - // 表格属性  
229 - tableProps() {  
230 - return {  
231 - size: 'mini',  
232 - rowKey: 'id',  
233 - border: true,  
234 - highlightCurrentRow: true,  
235 - data: this.tableData,  
236 - };  
237 - },  
238 - // 表格事件  
239 - tableEvent() {  
240 - return {  
241 - 'selection-change': this.onSelectionChange,  
242 - };  
243 - },  
244 - // 分页参数  
245 - pageParams() {  
246 - return {  
247 - currentPage: this.currentPage,  
248 - pageSize: this.pageSize,  
249 - };  
250 - },  
251 - // 分页器属性  
252 - paginationProps() {  
253 - return {  
254 - 'current-page': this.currentPage,  
255 - 'page-sizes': this.pageSizes,  
256 - 'page-size': this.pageSize,  
257 - layout: this.layout,  
258 - total: this.total,  
259 - };  
260 - },  
261 - // 分页器事件  
262 - paginationEvent() {  
263 - return {  
264 - 'size-change': this.onPageSizeChange,  
265 - 'current-change': this.onCurrentPageChange,  
266 - };  
267 - },  
268 - },  
269 - created() {  
270 - if (this.auto) {  
271 - this.search(); 219 + dialogTitle() {
  220 + return this.dialogMode === 'edit' ? '编辑' : '新增';
272 } 221 }
273 }, 222 },
274 methods: { 223 methods: {
275 - // 空Promise  
276 - emptyPromise() {  
277 - return new Promise(resolve => resolve());  
278 - },  
279 - // 重置查询  
280 - onSearch() {  
281 - this.currentPage = 1;  
282 - this.loadData();  
283 - },  
284 - // 切换展开状态  
285 - toggle() {  
286 - this.collapsed = !this.collapsed;  
287 - },  
288 - // 查询数据  
289 - search() {  
290 - this.loadData();  
291 - },  
292 - // 加载数据  
293 - async loadData() {  
294 - this.loading = true;  
295 - const params = {  
296 - ...this.searchModel,  
297 - ...this.pageParams,  
298 - };  
299 - const searchAPI = this.searchAPI || this.emptyPromise;  
300 - await searchAPI(params)  
301 - .then(response => {  
302 - const { result = [], totalCount = 0 } = response || {};  
303 - this.tableData = result || [];  
304 - this.total = totalCount || 0;  
305 - })  
306 - .finally(() => {  
307 - this.loading = false;  
308 - }); 224 + searchAPI(params) {
  225 + return new Promise(resolve => {
  226 + setTimeout(() => {
  227 + const source = [
  228 + { id: '0', name: '李饼', age: 32 },
  229 + { id: '1', name: '陈拾', age: 20 },
  230 + { id: '3', name: '王七', age: 26 },
  231 + { id: '4', name: '崔倍', age: 27 },
  232 + { id: '5', name: '孙豹', age: 38 },
  233 + { id: '6', name: '庞柏', age: 42 },
  234 + { id: '7', name: '蔡疏', age: 60 },
  235 + { id: '8', name: '卢纳', age: 55 },
  236 + ];
  237 + const list = source.filter(item => `${item.name}`.includes(params.name));
  238 + resolve({
  239 + result: list,
  240 + totalCount: list.length
  241 + });
  242 + }, 300);
  243 + });
309 }, 244 },
310 - // 重置搜索表单  
311 - onReset() {  
312 - this.searchModel = this.cloneDeep(this.originData).searchModel; 245 + openNew() {
  246 + this.dialogMode = 'new';
  247 + this.dialogVisible = true;
313 }, 248 },
314 - // 多选  
315 - onSelectionChange(selection) {  
316 - this.selection = selection; 249 + openEdit({ row }) {
  250 + this.dialogMode = 'edit';
  251 + this.form = this.cloneDeep(row);
  252 + this.dialogVisible = true;
317 }, 253 },
318 - // 切换当前页码  
319 - onCurrentPageChange(value) {  
320 - this.currentPage = value;  
321 - this.$nextTick(this.loadData); 254 + onSubmit() {
  255 + this.$refs.form.validate(valid => {
  256 + if (valid) {
  257 + let data = this.cloneDeep(this.form);
  258 + if (this.dialogMode === 'new') {
  259 + delete data.id;
  260 + console.log('新增提交:', data);
  261 + } else if (this.dialogMode === 'edit') {
  262 + console.log('修改提交:', data);
  263 + }
  264 + this.submitting = true;
  265 + setTimeout(() => {
  266 + this.submitting = false;
  267 + this.dialogVisible = false;
  268 + this.search();
  269 + }, 1500);
  270 + }
  271 + });
322 }, 272 },
323 - // 切换最大页码  
324 - onPageSizeChange(value) {  
325 - this.currentPage = 1;  
326 - this.pageSize = value;  
327 - this.$nextTick(this.loadData); 273 + onCancel() {
  274 + this.dialogVisible = false;
328 }, 275 },
  276 + resetForm() {
  277 + this.form = this.getOriginData().form;
  278 + this.$refs.form.resetFields();
  279 + }
329 }, 280 },
330 }; 281 };
331 -```  
332 \ No newline at end of file 282 \ No newline at end of file
  283 +</script>
  284 +
  285 +```
  286 +
  287 +:::
  288 +
  289 +## 内置方法
  290 +
  291 +本配置中,已经混入了`MIX_ORIGIN`,内置了`originData`对象和`getOriginData`方法。
examples/views/docs/develop/scheme/scheme.md 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +# Scheme 方案开发
  2 +
  3 +通过配置JSON Scheme的方式快速生成一些业务组件
  4 +
  5 +## 基础用法
0 \ No newline at end of file 6 \ No newline at end of file
packages/select/index.vue
1 <template> 1 <template>
2 <el-select 2 <el-select
  3 + ref="select"
3 :size="selectSize" 4 :size="selectSize"
4 :disabled="selectDisabled" 5 :disabled="selectDisabled"
5 :value-key="valueKey" 6 :value-key="valueKey"
@@ -77,16 +78,6 @@ export default { @@ -77,16 +78,6 @@ export default {
77 type: String, 78 type: String,
78 default: ',', 79 default: ',',
79 }, 80 },
80 - // 请求参数  
81 - params: {  
82 - type: Object,  
83 - default: () => ({}),  
84 - },  
85 - // 请求配置  
86 - config: {  
87 - type: Object,  
88 - default: () => ({}),  
89 - },  
90 // 自定义接口 81 // 自定义接口
91 queryApi: Function, 82 queryApi: Function,
92 lazy: Boolean, 83 lazy: Boolean,
@@ -146,6 +137,9 @@ export default { @@ -146,6 +137,9 @@ export default {
146 selectClearable() { 137 selectClearable() {
147 return this.clearable || this.remote; 138 return this.clearable || this.remote;
148 }, 139 },
  140 + elSelect() {
  141 + return this.$refs.select;
  142 + },
149 remote() { 143 remote() {
150 return !!this.queryApi; 144 return !!this.queryApi;
151 }, 145 },
@@ -279,6 +273,12 @@ export default { @@ -279,6 +273,12 @@ export default {
279 this.loaded = true; 273 this.loaded = true;
280 } 274 }
281 }, 275 },
  276 + focus() {
  277 + this.elSelect.focus();
  278 + },
  279 + blur() {
  280 + this.elSelect.blur();
  281 + },
282 }, 282 },
283 }; 283 };
284 </script> 284 </script>
packages/table/editable.vue
@@ -131,6 +131,9 @@ export default { @@ -131,6 +131,9 @@ export default {
131 value(val) { 131 value(val) {
132 this.tableData = val || []; 132 this.tableData = val || [];
133 }, 133 },
  134 + data(val) {
  135 + this.tableData = val || [];
  136 + },
134 }, 137 },
135 data() { 138 data() {
136 return { 139 return {
packages/table/normal.vue
@@ -51,6 +51,9 @@ export default { @@ -51,6 +51,9 @@ export default {
51 value(val) { 51 value(val) {
52 this.tableData = val || []; 52 this.tableData = val || [];
53 }, 53 },
  54 + data(val) {
  55 + this.tableData = val || [];
  56 + },
54 }, 57 },
55 computed: { 58 computed: {
56 _elFormItemSize() { 59 _elFormItemSize() {