VUE进阶(实现左侧菜单的动态加载,数据动态加载)

1.实现左侧菜单动态加载

1.首先添加模板到组件里面

<el-menu>
	<el-submenu index="" key="">
        <template slot="title">
            <i class=""></i>
            <span></span>
        </template>
		<el-menu-item index="" key="">
            <i class=""></i>
            <span></span>
        </el-menu-item>
	</el-submenu>
</el-menu>

2.将向后台发送axios请求,获取菜单数据

let url = this.axios.urls.SYSTEM_MENU
  this.axios.get(url, {}).then(resp => {
    console.log(resp);
    this.menus = resp.data.rows;
  }).catch(err => {
    console.log(err);
  })

3.使用v-for将数据放上去

<el-submenu v-for="m in menus" :index="m.url+m.id" :key="'key_'+m.id">
      <template slot="title">
        <i :class="m.icon"></i>
        <span>{{m.text}}</span>
      </template>
      <el-menu-item v-for="m2 in m.modules" :index="m2.url+m2.id" :key="'key_'+m2.id">
        <i :class="m.icon"></i>
        <span>{{m.text}}</span>
      </el-menu-item>
    </el-submenu>

2.点击书籍管理,实现数据加载

2.1.入门示例

<el-table :data="tableData" style="width: 100%">
	<el-table-column prop="date" label="日期" width="180"></el-table-column>
    <el-table-column prop="name" label="姓名" width="180"></el-table-column>
    <el-table-column prop="address" label="地址"></el-table-column>
</el-table>

2.2.Table表格基本属性

属性说明
data要显示的数据
heightTable 的高度,默认为自动高度。
max-heightTable 的最大高度。
stripe是否为斑马纹 table
border是否带有纵向边框
sizeTable 的尺寸。medium / small / mini
fit列的宽度是否自撑开,默认true

更多Table表格属性请查看官网信息。

2.3.Table表格列属性

属性说明
type对应列的类型(selection/index/expand)。
selection 则显示多选框;
index 则显示该行的索引(从 1 开始计算);
expand 则显示为一个可展开的按钮
index如果设置了 type=index,可以通过传递 index 属性来自定义索引
column-keycolumn 的 key,如果需要使用 filter-change 事件,则需要此属性标识是哪个 column 的筛选条件
label显示的标题
prop对应列内容的字段名,也可以使用 property 属性
width对应列的宽度
min-width对应列的最小宽度,与 width 的区别是 width 是固定的,min-width 会把剩余宽度按比例分配给设置了 min-width 的列

更多Table表格列属性请查看官网信息。

2.4.综合案例

2.4.1.自定义索引

列表的第一列为序号,为保护数据信息,防止恶意爬虫,不能把后端给的id直接显示,应该显示行号

<el-table :data="result" style="width: 100%;" :border="true" max-height="390">
	<el-table-column type="index" label="序号" width="50" align="center" :index="indexMethod"></el-table-column>
	...
</el-table>

<script>
	export default {
		name:'BookList',
		data:function(){
        	page:1,     //当前页码
            rows:10		//每页条数
        },
        methods:{
            //自定义索引
			indexMethod: function(index) {
				return (this.page - 1) * this.rows + (index + 1);
			}
        }
    }
</script>

2.4.2.查询展示

搜索栏定义

<!--搜索栏-->
<el-form :inline="true" class="form-search">
    <el-form-item label="书本名称">
        <el-input v-model="bookname" placeholder="请输入书本名称"></el-input>
    </el-form-item>
    <el-form-item>
        <el-button type="primary" icon="el-icon-search" @click="query(1)">查询</el-button>
    </el-form-item>
</el-form>

查询事件定义

//数据查询
query: function(page) {
    if(null!=page)
    	this.page=page;
    var params = {
        bookname: this.bookname,
        page: this.page,
        rows: this.rows
    }
    //console.log(params);
    var url = this.axios.urls.BOOK_QUERY_PAGER;
    this.axios.post(url, params).then(resp => {
        //console.log(resp);
        //将后台的查询结果集赋值给this.result属性,通过数据双向绑定实现效果展示
        this.result = resp.data.rows;
    }).catch({});
}

2.4.3.插槽

在table组件中通常使用slot-scope(作用域插槽)来实现数据传递的需求。父组件设置列表数据,传递给子组件,子组件渲染 table 表格;同时子组件中数据变动,也可以传递到父组件中形成数据改变。

作用域插槽的目的是解决父组件、子组件、插槽之间的数据通讯的问题。

<el-table :data="tableData" style="width: 100%"
    <el-table-column label="操作" min-width="180">
        <template slot-scope="scope">
            <span style="margin-left: 10px">{{ scope.row.name }}</span>
        </template>
    </el-table-column>
</el-table>

slot-scope="scope"就是子组件传递出来的数据集合,包含row、column、$index等属性;类似将每一行的row对象封装到槽中,之后直接从scope中获取row对象信息即可。

3.分页查询

<!--分页组件-->
<el-pagination background 
	@size-change="handleSizeChange" 
	@current-change="handleCurrentChange" 
	:current-page="page"
	:page-sizes="[10, 20, 30, 40]" 
	:page-size="rows" 
	layout="total, sizes, prev, pager, next, jumper" 
	:total="total">
</el-pagination>

<script>
	export default {
        name: "BookList",
        data:function(){
            return {
                page:1,    //当前页码
                rows:10,   //每页条数
                total:0	   //总记录数
            }
        },
       	methods:{
            //每页显示条数改变事件
			handleSizeChange: function(row) {
				console.log(row);
			},
            //当前页码改变事件
			handleCurrentChange: function(page) {
				console.log(page);
			}
        }
    }
</script>

分页组件属性介绍

参数说明
small是否使用小型分页样式,默认:false
background是否为分页按钮添加背景色,默认:false
page-size每页显示条目个数,支持 .sync 修饰符,默认:10
total总条目数
current-page当前页数,支持 .sync 修饰符,默认:1
layout组件布局,子组件名用逗号分隔,默认:‘prev, pager, next, jumper, ->, total’
page-sizes每页显示个数选择器的选项设置,默认:[10, 20, 30, 40, 50, 100]

更多Pagination分页组件属性请查看官网信息。

分页组件事件介绍

事件说明回调函数
size-changepageSize 改变时会触发每页条数
current-changecurrentPage 改变时会触发当前页
prev-click用户点击上一页按钮改变当前页后触发当前页
next-click用户点击下一页按钮改变当前页后触发当前页
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 左侧菜单栏可以通过动态渲染实现。具体来说,可以通过一个菜单数据数组来控制菜单栏的显示和隐藏。 首先,需要在 Vue 实例中定义菜单数据数组,例如: ``` data() { return { menuList: [ { name: '菜单1', icon: 'el-icon-menu', children: [ { name: '子菜单1', path: '/menu1/child1' }, { name: '子菜单2', path: '/menu1/child2' } ] }, { name: '菜单2', icon: 'el-icon-document', children: [ { name: '子菜单3', path: '/menu2/child3' }, { name: '子菜单4', path: '/menu2/child4' } ] } ], currentMenu: '' } } ``` 其中,`menuList` 数组包含了所有的菜单信息,包括菜单名称、图标和子菜单列表。`currentMenu` 则是当前选中的菜单项。 接下来,在 HTML 模板中,使用 `v-for` 指令遍历菜单数据数组,生成菜单栏的 HTML 代码: ``` <el-menu :default-active="currentMenu" class="el-menu-vertical-demo" @select="handleMenuSelect"> <template v-for="(menu, index) in menuList"> <el-submenu v-if="menu.children" :index="index.toString()"> <template slot="title"> <i :class="menu.icon"></i> <span slot="title">{{ menu.name }}</span> </template> <el-menu-item v-for="(child, childIndex) in menu.children" :index="child.path" :key="childIndex">{{ child.name }}</el-menu-item> </el-submenu> <el-menu-item v-else :index="menu.path" :key="index.toString()"> <i :class="menu.icon"></i> <span slot="title">{{ menu.name }}</span> </el-menu-item> </template> </el-menu> ``` 在菜单栏中,使用 `v-if` 指令判断当前菜单项是否有子菜单,如果有,则生成一个子菜单,否则直接生成一个菜单项。同时,使用 `v-for` 指令遍历子菜单,生成子菜单项的 HTML 代码。 最后,在 Vue 实例中添加 `handleMenuSelect` 方法,用于处理菜单项的选中事件: ``` methods: { handleMenuSelect(index) { this.currentMenu = index; } } ``` 当用户选中菜单项时,该方法会将 `currentMenu` 属性更新为选中的菜单项的索引或路径,从而实现菜单栏的动态渲染。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值