antd-vue 学习笔记
版本是vue2的1.7.8版本
源码 胖了好鸭/antd-vue-learn (gitee.com)
table组件
基础使用
表格的基础使用只需要两个关键属性columns-列的配置,data-source-表格的数据
<!-- basic table -->
<template>
<a-table :columns="columns" :data-source="data" />
</template>
<script>
// 表格列的配置
// dataIndex 对应的是数据中的属性名
// key用来优化
// title表头名称
const columns = [
{
dataIndex: "name",
key: "name",
title: "name",
},
{
title: "Age",
dataIndex: "age",
key: "age",
},
{
title: "Address",
dataIndex: "address",
key: "address",
},
{
title: "Tags",
key: "tags",
dataIndex: "tags",
scopedSlots: { customRender: "tags" },
},
{
title: "Action",
key: "action",
scopedSlots: { customRender: "action" },
},
];
// 表格数据
const data = [
{
key: "1",
name: "John Brown",
age: 32,
address: "New York No. 1 Lake Park",
tags: ["nice", "developer"],
},
{
key: "2",
name: "Jim Green",
age: 42,
address: "London No. 1 Lake Park",
tags: ["loser"],
},
{
key: "3",
name: "Joe Black",
age: 32,
address: "Sidney No. 1 Lake Park",
tags: ["cool", "teacher"],
},
];
export default {
data() {
return {
data,
columns,
};
},
};
</script>
表格中的slot
在项目中通常要在表格里面使用表单或者自定义单元格显示效果,就使用到了slot相关的配置
需要在columns中增加scopedSlots属性,并定义slot名称,a-table会传递四个数据
text: 当前单元格的数据
record:当前行的数据
index:所在行的index索引
dataIndex:包含当前column中的key的对象
所以如果在项目中需要动态获取当前的key值,可以使用record[dataIndex.key]
本实例还展示分页的使用,可以单独使用a-pagination组件进行分页控制,并需要在a-table上设置:pagination="false"
<!-- slot table -->
<template>
<div>
<a-table :columns="columns" :data-source="data" :pagination="false">
<template v-slot:name="text, record, index, dataIndex">
<a-input v-model="record[dataIndex.key]"></a-input>
</template>
</a-table>
<a-pagination
v-model="current"
show-size-changer
:page-size.sync="pageSize"
:total="500"
@showSizeChange="onShowSizeChange"
/>
</div>
</template>
<script>
const columns = [
{
dataIndex: "name",
key: "name",
title: "name",
scopedSlots: { customRender: "name" },
},
{
title: "Age",
dataIndex: "age",
key: "age",
},
{
title: "Address",
dataIndex: "address",
key: "address",
},
{
title: "Tags",
key: "tags",
dataIndex: "tags",
scopedSlots: { customRender: "tags" },
},
{
title: "Action",
key: "action",
scopedSlots: { customRender: "action" },
},
];
const data = [
{
key: "1",
name: "John Brown",
age: 32,
address: "New York No. 1 Lake Park",
tags: ["nice", "developer"],
},
{
key: "2",
name: "Jim Green",
age: 42,
address: "London No. 1 Lake Park",
tags: ["loser"],
},
{
key: "3",
name: "Joe Black",
age: 32,
address: "Sidney No. 1 Lake Park",
tags: ["cool", "teacher"],
},
];
export default {
data() {
return {
data,
columns,
current: 1,
pageSize: 10,
};
},
watch: {
pageSize(val) {
console.log("pageSize", val);
},
current(val) {
console.log("current", val);
},
},
methods: {
handleClick(text, record, index, dataIndex) {
console.log(text, record, index, dataIndex);
},
onShowSizeChange(current, size) {
console.log(current, size);
},
},
};
</script>
可选表格
可选表格只需要在table中配置row-selection属性
selectedRowKeys是选中的key数组,可以设置默认选中的行
onChange是当选中行变化时,触发的事件
<!-- selection table -->
<template>
<a-table
:columns="columns"
:data-source="data"
:row-selection="{
selectedRowKeys: selectedRowKeys,
onChange: onSelectChange,
}"
>
<template v-slot:name="text">
<a-input :value="text" />
</template>
</a-table>
</template>
<script>
const columns = [
{
title: "Name",
dataIndex: "name",
key: "name",
scopedSlots: { customRender: "name" },
},
{
title: "Age",
dataIndex: "age",
key: "age",
width: "12%",
},
{
title: "Address",
dataIndex: "address",
width: "30%",
key: "address",
},
];
const data = [
{
key: 1,
name: "John Brown sr.",
age: 60,
address: "New York No. 1 Lake Park",
},
{
key: 2,
name: "Joe Black",
age: 32,
address: "Sidney No. 1 Lake Park",
},
];
export default {
data() {
return {
data,
columns,
selectedRowKeys: [1],
};
},
methods: {
onSelectChange(selectedRowKeys, selectedRows) {
console.log(selectedRowKeys, selectedRows);
this.selectedRowKeys = selectedRowKeys;
},
},
};
</script>
Form
使用FormModel和element-ui基本一致
<template>
<a-form-model :model="form" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-form-model-item label="Activity name">
<a-input v-model="form.name" />
</a-form-model-item>
<a-form-model-item label="Activity zone">
<a-select v-model="form.region" placeholder="please select your zone">
<a-select-option value="shanghai">
Zone one
</a-select-option>
<a-select-option value="beijing">
Zone two
</a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item label="Activity time">
<a-date-picker
v-model="form.date1"
show-time
type="date"
placeholder="Pick a date"
style="width: 100%;"
/>
</a-form-model-item>
<a-form-model-item label="Instant delivery">
<a-switch v-model="form.delivery" />
</a-form-model-item>
<a-form-model-item label="Activity type">
<a-checkbox-group v-model="form.type">
<a-checkbox value="1" name="type">
Online
</a-checkbox>
<a-checkbox value="2" name="type">
Promotion
</a-checkbox>
<a-checkbox value="3" name="type">
Offline
</a-checkbox>
</a-checkbox-group>
</a-form-model-item>
<a-form-model-item label="Resources">
<a-radio-group v-model="form.resource">
<a-radio value="1">
Sponsor
</a-radio>
<a-radio value="2">
Venue
</a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item label="Activity form">
<a-input v-model="form.desc" type="textarea" />
</a-form-model-item>
<a-form-model-item :wrapper-col="{ span: 14, offset: 4 }">
<a-button type="primary" @click="onSubmit">
Create
</a-button>
<a-button style="margin-left: 10px;">
Cancel
</a-button>
</a-form-model-item>
</a-form-model>
</template>
<script>
export default {
data() {
return {
labelCol: { span: 4 },
wrapperCol: { span: 14 },
form: {
name: '',
region: undefined,
date1: undefined,
delivery: false,
type: [],
resource: '',
desc: '',
},
};
},
methods: {
onSubmit() {
console.log('submit!', this.form);
},
},
};
</script>
Modal对话框
基础使用
modal对话框使用v-model来控制对话框是否显示,可以通过default slot传递自定义内容。
<template>
<div>
<a-button type="primary" @click="showModal">
Open Modal
</a-button>
<a-modal v-model="visible" title="Basic Modal" @ok="handleOk">
<p>Some contents...</p>
<p>Some contents...</p>
<p>Some contents...</p>
</a-modal>
</div>
</template>
<script>
export default {
data() {
return {
visible: false,
};
},
methods: {
showModal() {
this.visible = true;
},
handleOk(e) {
console.log(e);
this.visible = false;
},
},
};
</script>
modal-form
在modal中使用form
可使用modal中footer slot自定义modal的底部按钮
<template>
<div>
<a-button type="primary" @click="showModal">
Open Modal with customized footer
</a-button>
<a-modal v-model="visible" title="ModalForm" width="50%">
<a-form-model
ref="ruleForm"
:model="form"
:rules="rules"
:label-col="labelCol"
:wrapper-col="wrapperCol"
>
<a-form-model-item ref="name" label="Activity name" prop="name">
<a-input
v-model="form.name"
@blur="
() => {
$refs.name.onFieldBlur();
}
"
/>
</a-form-model-item>
<a-form-model-item label="Activity zone" prop="region">
<a-select v-model="form.region" placeholder="please select your zone">
<a-select-option value="shanghai"> Zone one </a-select-option>
<a-select-option value="beijing"> Zone two </a-select-option>
</a-select>
</a-form-model-item>
<a-form-model-item label="Activity time" required prop="date1">
<a-date-picker
v-model="form.date1"
show-time
type="date"
placeholder="Pick a date"
style="width: 100%"
/>
</a-form-model-item>
<a-form-model-item label="Instant delivery" prop="delivery">
<a-switch v-model="form.delivery" />
</a-form-model-item>
<a-form-model-item label="Activity type" prop="type">
<a-checkbox-group v-model="form.type">
<a-checkbox value="1" name="type"> Online </a-checkbox>
<a-checkbox value="2" name="type"> Promotion </a-checkbox>
<a-checkbox value="3" name="type"> Offline </a-checkbox>
</a-checkbox-group>
</a-form-model-item>
<a-form-model-item label="Resources" prop="resource">
<a-radio-group v-model="form.resource">
<a-radio value="1"> Sponsor </a-radio>
<a-radio value="2"> Venue </a-radio>
</a-radio-group>
</a-form-model-item>
<a-form-model-item label="Activity form" prop="desc">
<a-input v-model="form.desc" type="textarea" />
</a-form-model-item>
</a-form-model>
<template slot="footer">
<a-button key="cancel" @click="handleCancel">取消</a-button>
<a-button key="reset" @click="handleReset">重置</a-button>
<a-button
key="submit"
type="primary"
:loading="loading"
@click="handleOk"
>
提交
</a-button>
</template>
</a-modal>
</div>
</template>
<script>
export default {
data() {
return {
loading: false,
visible: false,
labelCol: { span: 4 },
wrapperCol: { span: 14 },
other: "",
form: {
name: "",
region: undefined,
date1: undefined,
delivery: false,
type: [],
resource: "",
desc: "",
},
rules: {
name: [
{
required: true,
message: "Please input Activity name",
trigger: "blur",
},
{
min: 3,
max: 5,
message: "Length should be 3 to 5",
trigger: "blur",
},
],
region: [
{
required: true,
message: "Please select Activity zone",
trigger: "change",
},
],
date1: [
{ required: true, message: "Please pick a date", trigger: "change" },
],
type: [
{
type: "array",
required: true,
message: "Please select at least one activity type",
trigger: "change",
},
],
resource: [
{
required: true,
message: "Please select activity resource",
trigger: "change",
},
],
desc: [
{
required: true,
message: "Please input activity form",
trigger: "blur",
},
],
},
};
},
methods: {
showModal() {
this.visible = true;
},
handleOk() {
this.loading = true;
this.$refs.ruleForm.validate((valid) => {
if (valid) {
this.visible = false;
this.loading = false;
} else {
console.log("error submit!!");
this.loading = false;
return false;
}
});
},
handleCancel() {
this.visible = false;
},
handleReset() {
this.$refs.ruleForm.resetFields();
},
},
};
</script>