zoukankan      html  css  js  c++  java
  • ant design vue 表格和国际化的使用

    官方文档: https://www.antdv.com/components/table-cn/

    注意 #

    在 Table 中,dataSourcecolumns 里的数据值都需要指定 key 值。对于 dataSource 默认将每列数据的 key 属性作为唯一的标识。

    如果你的数据没有这个属性,务必使用 rowKey 来指定数据列的主键。若没有指定,控制台会出现缺少 key 的提示,表格组件也会出现各类奇怪的错误。

    Column #

    列描述数据对象,是 columns 中的一项,Column 使用相同的 API。

    dataIndex 列数据在数据项中对应的 key,支持 a.b.c 的嵌套写法

    key Vue 需要的 key,如果已经设置了唯一的 dataIndex,可以忽略这个属

    也就是说column 如果指定了dataIndex 可以不用指定key

    最基本的表格

    <template>
        <a-table :columns="columns" :data-source="data">
    
        </a-table>
    </template>
    <script>
        //表头数据
        //title 为表头的标题 dataIndex为列数据在数据项中对应的 key
        //
        const columns = [
            {
                title : 'name',
                dataIndex: 'name',
            },
            {
                title: 'Age',
                dataIndex: 'age',
            },
            {
                title: 'Address',
                dataIndex: 'address',
            },
            {
                title: 'Action',
                dataIndex: 'action',
            },
        ];
    
        //表格数据
        const data = [
            {
                key: '1',
                name: 'John Brown',
                age: 32,
                address: 'New York No. 1 Lake Park',
                action: '123465'
            },
            {
                key: '2',
                name: 'Jim Green',
                age: 42,
                address: 'London No. 1 Lake Park',
            },
            {
                key: '3',
                name: 'Joe Black',
                age: 32,
                address: 'Sidney No. 1 Lake Park',
            },
        ];
    
        export default {
            data() {
                return {
                    data,
                    columns,
                };
            },
        };
    </script>
    

    效果

    image-20201111165104824

    给最后一列加上编辑和删除按钮

    如果想在最后一列渲染html 直接在data数组中写html代码是没用的,会直接解析成字符串,那么怎么办呢?

    官方使用的方式是:插槽

    表格插槽的使用

    1.在标签中,定义插槽

    例:

    <!--插槽一定要在表格组件标签中-->
    <!--定义插槽渲染-->
    <!--
        slot="action" 表示是在columns(某列)中的表头值为action中插入标签,往这个位置插入插槽span中间的内容
        slot-scope="text, record, index"
            text    表示当前行当前列的值
            record  表示当前行的数据
            index   表格索引
    -->
    <span slot="action" slot-scope="text, record, index">
        <a-button type="primary" @click="edit(text, record, index)">编辑</a-button>
        <a-button type="danger">删除</a-button>
    </span>
    

    2.表头数据列(columns)中,使用插槽

    例:

    {
        title: 'Action',
        dataIndex: 'action',
        //使用插槽
        scopedSlots: { customRender: 'action' },
    },
    

    3.定义点击事件

    例:

    export default {
        data() {
            return {
                data,
                columns,
            };
        },
        methods:{
            edit(text, record, index){
                console.log(text)
                console.log(record)
                console.log(index)
            }
        }
    };
    

    效果

    image-20201111170113093

    完整代码

    <template>
        <a-table :columns="columns" :data-source="data">
    
            <!--插槽一定要在表格组件标签中-->
            <!--定义插槽渲染-->
            <!--
                slot="action" 表示是在columns(某列)中的表头值为action中插入标签,往这个位置插入插槽span中间的内容
                slot-scope="text, record, index"
                    text    表示当前行当前列的值
                    record  表示当前行的数据
                    index   表格索引
            -->
            <span slot="action" slot-scope="text, record, index">
                <a-button type="primary" @click="edit(text, record, index)">编辑</a-button>
                <a-button type="danger">删除</a-button>
            </span>
        </a-table>
    </template>
    <script>
        //表头数据
        //title 为表头的标题 dataIndex为列数据在数据项中对应的 key
        const columns = [
            {
                title : 'name',
                dataIndex: 'name',
            },
            {
                title: 'Age',
                dataIndex: 'age',
            },
            {
                title: 'Address',
                dataIndex: 'address',
            },
            {
                title: 'Action',
                dataIndex: 'action',
                //使用插槽
                scopedSlots: { customRender: 'action' },
            },
        ];
    
        //表格数据
        const data = [
            {
                key: '1',
                name: 'John Brown',
                age: 32,
                address: 'New York No. 1 Lake Park',
                action: '123465'
            },
            {
                key: '2',
                name: 'Jim Green',
                age: 42,
                address: 'London No. 1 Lake Park',
            },
            {
                key: '3',
                name: 'Joe Black',
                age: 32,
                address: 'Sidney No. 1 Lake Park',
            },
        ];
    
        export default {
            data() {
                return {
                    data,
                    columns,
                };
            },
            methods:{
                edit(text, record, index){
                    console.log(text)
                    console.log(record)
                    console.log(index)
                }
            }
        };
    </script>
    
    

    rowKey属性 绑定每行的key

    rowKey 表格行 key 的取值,可以是字符串或一个函数 string|Function(record):string 'key'

    在最开始,就提到了表格的表头和表格数据都必须有个唯一的key,不过不指定会怎么样呢?会报错,如

    warning.js?2149:7 Warning: [antdv: Each record in table should have a unique key prop,or set rowKey to an unique primary key.]

    image-20201117111857571

    这时候你如果数据是静态,直接加上key就可以,那如果数据是从后端获取的并且后端没有key这个属性,而是其他属性。怎么办呢?这时候可以用rowKey属性进行绑定

    如:

    <!--
        :columns="columns"  表头数据
        :data-source="data" 表格数据
        :rowKey="record => record.id"   id为 Data 中的一个属性
    -->
    <a-table :columns="columns" :data-source="data" :rowKey="record => record.id">
    

    全部方式

    rowKey 取值方式

    带冒号的表示绑定的是表达式
    不带的表示绑定的就是值

    <a-table
            :columns="columns"
            :data-source="data"
            size="middle"
            :rowKey='record=>record.id'> <!--id为 data 中的一个属性-->
    </a-table>
    <a-table
            :columns="columns"
            :data-source="data"
            size="middle"
            :rowKey="(record,index)=>{return index}"> <!--record 为每一条数据, index 索引-->
    </a-table>
    <a-table
            :columns="columns"
            :data-source="data"
            size="middle"
            rowKey="id"> <!--id为 data 中的一个属性 !!! 这里的rowKey不需要冒号 -->
    </a-table>
    

    表格数据是否加载中

    loading 页面是否加载中 boolean|object false

    例:

    表格标签中设置 :loading="loading" 属性绑定
    <a-table :columns="columns" :data-source="data" rowKey="id" :loading="loading">
    
    设置默认值
    data() {
        return {
        	//为true表示 正在加载中
        	loading : true,
        };
    }
    
    修改loading状态
    getAdminList() {
        this.axios.get(process.env.VUE_APP_API_URL + this.urls.admin_list).then((data) => {
            //修改loading 状态
            this.loading = false;
        });
    },
    

    上面这个例子表示,表格初始为load状态,获取完后为load完毕

    表格分页

    pagination 分页器,参考配置项或 pagination文档,设为 false 时不展示和进行分页 object

    事件

    change 分页、排序、筛选变化时触发 Function(pagination, filters, sorter, { currentDataSource })

    https://www.antdv.com/components/table-cn/#事件

    https://www.antdv.com/components/pagination-cn/#API

    注意:写完需要重启服务和清除缓存

    例:

    表格组件设置绑定pagination

    <!--表格-->
    <!--
        :columns="columns"  表头数据
        :data-source="data" 表格数据
        rowKey="id"   id为 data 中的一个属性
        :loading="loading" 表格是否load
        :pagination="pagination" 分页参数
    -->
    <a-table :columns="columns" :data-source="data" rowKey="id" :loading="loading" :pagination="pagination"  >
        <span slot="status" slot-scope="text, record, index">
            <div v-if="text == 1">
                <a-button type="primary" @click="changeActive(text, record, index)">已启用</a-button>
            </div>
            <div v-else>
                <a-button type="danger" @click="changeActive(text, record, index)">已禁用</a-button>
            </div>
        </span>
        <!--插槽一定要在表格组件标签中-->
        <!--定义插槽渲染-->
        <!--
            slot="action" 表示是在columns(某列)中的表头值为action中插入标签,往这个位置插入插槽span中间的内容
            slot-scope="text, record, index"
                text    表示当前行当前列的值
                record  表示当前行的数据
                index   表格索引
        -->
        <span slot="action" slot-scope="text, record, index">
            <a-button type="primary" @click="edit(text, record, index)">编辑</a-button>
            <a-button type="danger">删除</a-button>
        </span>
    </a-table>
    

    设置data()里面的初始化参数

    //表格数据
    data : [],
    /**
     * 表头数据
     * title 为表头的标题
     * dataIndex为列数据在数据项中对应的 key
     * scopedSlots 对应插槽
     */
    columns : [
        {
            title: '登录用户名',
            dataIndex: 'username',
        },
        {
            title: '昵称',
            dataIndex: 'nickname',
        },
        {
            title: '状态',
            dataIndex: 'status',
            scopedSlots: {customRender: 'status'},
        },
        {
            title: '操作',
            dataIndex: 'action',
            //使用插槽
            scopedSlots: {customRender: 'action'},
        },
    ],
    //表格load标志
    loading : true,
    //表格分页参数
    pagination: {
        pageNo: 1,
        pageSize: 10, // 默认每页显示数量
        showSizeChanger: true, // 显示可改变每页数量
        pageSizeOptions: ['10', '20', '50', '100'], // 每页数量选项
        showTotal: total => `共 ${total} 条数据`, // 显示总数
        onShowSizeChange: (current, pageSize) => this.changePageSize(current, pageSize), // 改变每页数量时更新显示
        onChange:(page,pageSize)=>this.changePage(page,pageSize),//点击页码事件
        total:0 //总条数
    },
    

    设置methed触发的相关方法

    //获取管理员列表
    getAdminList(param) {
        //初始化分页参数
        if(param === undefined || param === null){
            param = {
                current : 1,
                pageSize : 10
            }
        }
    
    	//http://www.myadmin.com/api/system/admin?pageNow=1&pageSize=100
        this.axios.get(process.env.VUE_APP_API_URL + this.urls.admin_list,{params: {
            pageNow : param.current,
            pageSize : param.pageSize,
        }}).then((data) => {
            //修改loading 状态
            this.loading = false;
            //数据
            this.data = data.data.data.data;
            //分页参数
           /* this.pagination.current = data.data.data.pageNow;
            this.pagination.pageSize = data.data.data.pageSize;
            this.pagination.showTotal = data.data.data.lineCount;*/
            this.pagination.total = data.data.data.lineCount;
            console.log(this.pagination);
        });
    },
    //点击页码事件
    changePage(page,pageSize) {
        console.log(page, '当前页.......');
        console.log(pageSize, '每页大小.......');
        this.getAdminList({
            current : page,
            pageSize : pageSize
        })
    },
    
    //每页显示数量改变的事件
    changePageSize(current, pageSize){
        console.log(current, '当前页.......');
        console.log(pageSize, '每页大小.......');
        this.getAdminList({
            current : current,
            pageSize : pageSize
        })
    },
    

    钩子函数初始化数据

    //页面渲染之前,$el创建之后 去加载
    mounted() {
        //获取左侧菜单
        this.getAdminList();
    },
    

    后端接口tp5.1

    //管理员列表
    public function index(){
        $data = input('');
        //dump($data);
        //默认
        $pageNow = 1;//当前页
        $pageSize = 10;//一页多少行
        $lineCount = 0;//总记录数
        $pageCount = 0;//总页数
        if(!empty($data)){
            if(isset($data['pageNow'])){
                $pageNow = $data['pageNow'];
            }
            if(isset($data['pageSize'])){
                $pageSize = $data['pageSize'];
            }
        }
    
        $lineCount = AdminModel::count();
        $pageCount = ceil($lineCount / $pageSize);
        $data = AdminModel::order('id', 'desc')->limit(($pageNow-1) * $pageSize,$pageSize)->select();
        return $this->returnJson(200, '管理员列表', [
            'pageNow' => (int)$pageNow,
            'pageSize' => (int)$pageSize,
            'lineCount' => (int)$lineCount,
            'pageCount' => (int)$pageCount,
            'data' => $data,
        ]);
    }
    

    效果

    image-20201124101038799

    前端完整代码(参考,太长可不看)

    <template>
        <div>
            <!--添加按钮和模态框-->
            <a-button type="primary" @click="showModal('add')">
                添加
            </a-button>
            <!--对话框-->
            <a-modal
                    :visible="visible"
                    :title= "modelTitle"
                    :confirm-loading="confirmLoading"
                    okText='确认'
                    cancel-text="取消"
                    @cancel="hideModel"
                    @ok="add"
            >
                <!--表单-->
                <a-form-model :model="form">
                    <a-form-model-item label="用户名">
                        <a-input v-model="form.username" />
                    </a-form-model-item>
                    <a-form-model-item label="密码">
                        <a-input v-model="form.password" />
                    </a-form-model-item>
                    <a-form-model-item label="状态">
                        <a-radio-group v-model="form.status">
                            <a-radio value="1">
                                启用
                            </a-radio>
                            <a-radio value="0">
                                禁用
                            </a-radio>
                        </a-radio-group>
                    </a-form-model-item>
                </a-form-model>
            </a-modal>
            <!--表格-->
            <!--
                :columns="columns"  表头数据
                :data-source="data" 表格数据
                rowKey="id"   id为 data 中的一个属性
                :loading="loading" 表格是否load
                :pagination="pagination" 分页参数
            -->
            <a-table :columns="columns" :data-source="data" rowKey="id" :loading="loading" :pagination="pagination"  >
                <span slot="status" slot-scope="text, record, index">
                    <div v-if="text == 1">
                        <a-button type="primary" @click="changeActive(text, record, index)">已启用</a-button>
                    </div>
                    <div v-else>
                        <a-button type="danger" @click="changeActive(text, record, index)">已禁用</a-button>
                    </div>
                </span>
                <!--插槽一定要在表格组件标签中-->
                <!--定义插槽渲染-->
                <!--
                    slot="action" 表示是在columns(某列)中的表头值为action中插入标签,往这个位置插入插槽span中间的内容
                    slot-scope="text, record, index"
                        text    表示当前行当前列的值
                        record  表示当前行的数据
                        index   表格索引
                -->
                <span slot="action" slot-scope="text, record, index">
                    <a-button type="primary" @click="edit(text, record, index)">编辑</a-button>
                    <a-button type="danger">删除</a-button>
                </span>
            </a-table>
        </div>
    </template>
    <script>
        export default {
            // 在实例中使用 components 属性注册需要用到的组件
            //注册组件
            data() {
                return {
                    //表格数据
                    data : [],
                    /**
                     * 表头数据
                     * title 为表头的标题
                     * dataIndex为列数据在数据项中对应的 key
                     * scopedSlots 对应插槽
                     */
                    columns : [
                        {
                            title: '登录用户名',
                            dataIndex: 'username',
                        },
                        {
                            title: '昵称',
                            dataIndex: 'nickname',
                        },
                        {
                            title: '状态',
                            dataIndex: 'status',
                            scopedSlots: {customRender: 'status'},
                        },
                        {
                            title: '操作',
                            dataIndex: 'action',
                            //使用插槽
                            scopedSlots: {customRender: 'action'},
                        },
                    ],
                    //表格load标志
                    loading : true,
                    //表格分页参数
                    pagination: {
                        pageNo: 1,
                        pageSize: 10, // 默认每页显示数量
                        showSizeChanger: true, // 显示可改变每页数量
                        pageSizeOptions: ['10', '20', '50', '100'], // 每页数量选项
                        showTotal: total => `共 ${total} 条数据`, // 显示总数
                        onShowSizeChange: (current, pageSize) => this.changePageSize(current, pageSize), // 改变每页数量时更新显示
                        onChange:(page,pageSize)=>this.changePage(page,pageSize),//点击页码事件
                        total:0 //总条数
                    },
                    //模态对话框标题
                    modelTitle: '',
                    //模态框是否显示
                    visible: false,
                    //表单load
                    confirmLoading: false,
                    form : {
                        username : '',
                        password : '',
                        status : '1'
                    }
                };
            },
            //页面渲染之前,$el创建之后 去加载
            mounted() {
                //获取左侧菜单
                this.getAdminList();
            },
            methods: {
                //获取管理员列表
                getAdminList(param) {
                    //初始化分页参数
                    if(param === undefined || param === null){
                        param = {
                            current : 1,
                            pageSize : 10
                        }
                    }
    
                    this.axios.get(process.env.VUE_APP_API_URL + this.urls.admin_list,{params: {
                        pageNow : param.current,
                        pageSize : param.pageSize,
                    }}).then((data) => {
                        //修改loading 状态
                        this.loading = false;
                        //数据
                        this.data = data.data.data.data;
                        //分页参数
                       /* this.pagination.current = data.data.data.pageNow;
                        this.pagination.pageSize = data.data.data.pageSize;
                        this.pagination.showTotal = data.data.data.lineCount;*/
                        this.pagination.total = data.data.data.lineCount;
                        console.log(this.pagination);
                    });
                },
                //点击页码事件
                changePage(page,pageSize) {
                    console.log(page, '当前页.......');
                    console.log(pageSize, '每页大小.......');
                    this.getAdminList({
                        current : page,
                        pageSize : pageSize
                    })
                },
    
                //每页显示数量改变的事件
                changePageSize(current, pageSize){
                    console.log(current, '当前页.......');
                    console.log(pageSize, '每页大小.......');
                    this.getAdminList({
                        current : current,
                        pageSize : pageSize
                    })
                },
                //模态对话框的方法
                showModal(type) {
                    //console.log(type, 'type........');
                    //设置对话框标题
                    type === 'add'? this.modelTitle = '添加管理员':this.modelTitle = '编辑管理员'
                    this.visible = true;
                },
                //关闭模态框
                hideModel() {
                    this.visible = false;
                    this.resetForm();
                },
    
                //重置form状态
                resetForm(){
                    this.form = {
                        username : '',
                        password : '',
                        status : '1'
                    }
                },
    
                //确认添加
                add(){
                    //发送请求
                    this.axios.post(process.env.VUE_APP_API_URL + this.urls.admin_add, this.form).then((data) => {
                        //重新刷新表格
                        this.data = this.getAdminList()
                        //恢复默认
                        this.resetForm();
                        //关闭按钮的load状态
                        this.confirmLoading = false;
                        //关闭模态框
                        this.visible = false;
                    });
                },
                //编辑
                edit(text, record, index) {
                    //设置模态框的form表单的值和选中
                    this.form.username = record.username;
                    this.form.password = record.password;
                    this.form.status = ''+record.status;
                    //显示模态框
                    this.showModal();
                },
                //改变状态
                changeActive(text, record, index) {
    
                },
    
            },
        };
    </script>
    
    

    国际化

    在前面的效果中可以看到,分页选择有英文,那怎么改成中文格式呢?

    这就需要使用国际化了

    https://www.antdv.com/components/locale-provider-cn/

    国际化分两种

    局部国际化

    例:

    在要国际化的组件外面包裹

    <a-locale-provider :locale="zhCN">
        <!--表格-->
        <!--
            :columns="columns"  表头数据
            :data-source="data" 表格数据
            rowKey="id"   id为 data 中的一个属性
            :loading="loading" 表格是否load
            :pagination="pagination" 分页参数
        -->
        <a-table :columns="columns" :data-source="data" rowKey="id" :loading="loading" :pagination="pagination"  >
            <span slot="status" slot-scope="text, record, index">
                <div v-if="text == 1">
                    <a-button type="primary" @click="changeActive(text, record, index)">已启用</a-button>
                </div>
                <div v-else>
                    <a-button type="danger" @click="changeActive(text, record, index)">已禁用</a-button>
                </div>
            </span>
            <!--插槽一定要在表格组件标签中-->
            <!--定义插槽渲染-->
            <!--
                slot="action" 表示是在columns(某列)中的表头值为action中插入标签,往这个位置插入插槽span中间的内容
                slot-scope="text, record, index"
                    text    表示当前行当前列的值
                    record  表示当前行的数据
                    index   表格索引
            -->
            <span slot="action" slot-scope="text, record, index">
                <a-button type="primary" @click="edit(text, record, index)">编辑</a-button>
                <a-button type="danger">删除</a-button>
            </span>
        </a-table>
    </a-locale-provider>
    

    script中引入并导出

    import zhCN from 'ant-design-vue/es/locale-provider/zh_CN';
    
    data() {
        return {
        	zhCN,
        }
    }
    

    效果

    image-20201124104817516

    全局国际化

    找到app.vue,使用包裹根路由出口,引入国际化模块并导出

    例:

    <template>
      <div id="app">
        <!--<div id="nav">
          <router-link to="/">Home</router-link> |
          <router-link to="/about">About</router-link>
        </div>-->
        <a-locale-provider :locale="zhCN">
          <router-view/>
        </a-locale-provider>
      </div>
    </template>
    <script>
      import zhCN from 'ant-design-vue/es/locale-provider/zh_CN';
      export default {
        data(){
          return {
            zhCN,
          }
        }
      }
    </script>
    

    关于LocaleProvider弃用

    用locale-provider组件的控制台你会发现,有个警告

    Warning: [antdv: LocaleProvider] LocaleProvider is deprecated. Please use locale with ConfigProvider instead

    大概意思就是

    警告:[antdv: LocaleProvider] ' LocaleProvider '已被弃用。请使用“locale”和“ConfigProvider”

    这是因为LocaleProvider是1.x的国际化的实现,2.0版本已经提供了更好的方式,但是1.0的也是可以使用的

    2.0全局国际化

    https://2x.antdv.com/docs/vue/i18n-cn/

    找到app.vue,使用包裹根路由出口,引入国际化模块并导出

    例:

    <template>
      <div id="app">
        <!--<div id="nav">
          <router-link to="/">Home</router-link> |
          <router-link to="/about">About</router-link>
        </div>-->
        <a-config-provider :locale="locale">
          <router-view/>
        </a-config-provider>
      </div>
    </template>
    <script>
      import zhCN from 'ant-design-vue/es/locale/zh_CN';
      export default {
        data(){
          return {
            locale:zhCN,
          }
        }
      }
    </script>
    

    效果

    image-20201124110407102

    可以看到已经没有任何警告了

  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/makalochen/p/13959592.html
Copyright © 2011-2022 走看看