使用Python3.7+Django2.0.4配合vue.js2.0的组件递归来实现无限级分类(递归层级结构)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_133
所谓的无限极分类是啥?其实简单点说就是一个人类可以繁衍出多个后代,然后一个后代又可以分另外多个后代这样无限繁衍下去(可以想象神奇动物在哪里2里面莱斯特兰奇的家族族谱),就好象linux系统你可以新建一个文件夹,然后在这个文件夹里又可以建一些个文件夹,在文件夹底下还可以建一些文件夹一样,随后使用tree命令就可以查看文件夹目录层级。
那么这种层级结构也成为树结构在日常的开发需求里也是很常见的,比如美多商城系统的商品分类,课程的目录章节,以及以及论坛里的帖子回复等等,本次我们后台利用Django来写一个能够返回层级结构数据的接口,接口将该数据以json的形式返回前端,前端使用vue的组件递归来展示数据。
首先,打开django项目中的models.py,新建一个类别的模型类,这里我们以最简单的parentid的形式来建立
class Cate(models.Model):
#主键 通过参数声明主键
id = models.AutoField(primary_key=True)
#分类名称
name = models.CharField(max_length=500)
#父级id
pid = models.IntegerField()
#表名
class Meta:
db_table = 'cate'
由于我们的项目基于drf框架,所以要增加一个序列器类,如果你的项目没有用drf,可以直接用json模块来进行序列化
from rest_framework import serializers
from myapp.models import Cate
class CateSer(serializers.ModelSerializer):
class Meta:
model = Cate
fields = "__all__"
由于django序列化出来的类不具备层级结构,所以我们提前写好一个用来递归的方法:
def xTree(datas):
lists=[]
tree={}
parent_id=''
for i in datas:
item=i
tree[item['id']]=item
root=None
for i in datas:
obj=i
if not obj['pid']:
root=tree[obj['id']]
lists.append(root)
else:
parent_id=obj['pid']
if 'childlist' not in tree[parent_id]:
tree[parent_id]['childlist']=[]
tree[parent_id]['childlist'].append(tree[obj['id']])
return lists
此时我们写一个视图接口,用来从数据库中读取数据
class MyTree(APIView):
def get(self,request):
#获取订单列表
catelist = Cate.objects.filter()
#序列化
catelist_ser = CateSer(catelist,many=True)
mylist= xTree(catelist_ser.data)
return Response(mylist)
请在mysql库里存一些测试数据
测试一下接口,看看是否以json的形式返回了层级结构
ok,接口没有问题,现在我们把目光投向前端,打开vue项目,新建一个Reply.vue组件
所谓递归组件: 就是组件可以在它们自己的模板中调用自身,不过它们只能通过 name 选项来做这件事,例如给组件设置属性 name: ‘Reply’,然后在模板中就可以使用 Reply 调用自己进行递归调用了
<template>
<div>
<li >
<div :class="[data.id==0 ? 'root': '', 'reply']">{{ data.name }}</div>
<ul v-if="data.childlist && data.childlist.length>0">
<Reply v-for="child in data.childlist" :key="child.id" :data="child"/>
</ul>
</li>
</div>
</template>
<script>
export default {
name: 'Reply', // 递归组件需要设置 name 属性,才能在模板中调用自己
props:['data'],
};
</script>
<style >
.reply {
padding-left: 4px;
border-left: 1px solid #eee;
}
ul {
padding-left: 20px;
list-style: none;
}
.root { display: none; }
</style>
然后在其他任意组件中调用该Reply.vue组件,传入刚刚写好的接口数据
<template>
<div>
<Reply :data="data" />
</div>
</template>
<script>
import {config,formatXml} from '../config.js';
import mh_test from './mh_test.vue';
import Reply from './Reply.vue';
import md5 from 'js-md5';
export default {
data () {
return {
data:{},
online: 0
}
},
components: {
//'mh_test':mh_test
Reply
},
//钩子方法
mounted:function(){
this.get_token();
},
//绑定事件
methods:{
get_token(){
this.axios.get('http://localhost:8000/mytree/').then((result) =>{
console.log(result);
var mytree = {'id':0,name:'123'};
mytree['childlist'] = result.data;
this.data = mytree;
console.log(this.data);
});
},
}
}
</script>
<style>
.on {
background: #cdcbff;
}
.off {
background: #fefdff;
}
</style>
最后请求页面,可以看到展示的效果:
当然了,vue组件也可以间接的调用自己实现递归,这涉及到组件之间的循环引用,这样比较麻烦,可读性也间接的降低了不少。
原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_133
使用Python3.7+Django2.0.4配合vue.js2.0的组件递归来实现无限级分类(递归层级结构)的更多相关文章
- 《vue.js2.0从入门到放弃》学习之路
原文地址: Vue.js2.0从入门到放弃---入门实例(一):http://blog.csdn.net/u013182762/article/details/53021374 Vue.js2.0从入 ...
- vue.js2.0+elementui ——> 后台管理系统
前言: 因为观察到vue.js的轻量以及实时更新数据的便捷性,于是新项目便决定使用vue.js2.0以及与之配套的elementui来完成.只是初次接触新框架,再使用过程中,遇见了各种各样“奇葩”的问 ...
- vue.js2.0实战(1):搭建开发环境及构建项目
Vue.js学习系列: vue.js2.0实战(1):搭建开发环境及构建项目 https://my.oschina.net/brillantzhao/blog/1541638 vue.js2.0实战( ...
- 浅谈Vue.js2.0某些概念
Vue.js2.0是一套构建用户界面的渐进式框架,目标是实现数据驱动和组件系统. A 渐进式框架 Vue.js是一个提供MVVM数据双向绑定的库,只专注于UI层面,这是它的核心.它本身没有解决SP ...
- vue.js2.0 (简易)水果商城 vuex vant-ui
vue.js2.0 (简易)水果商城 vuex vant-ui:https://segmentfault.com/a/1190000015690250 vue2.5全家桶 高仿vivo商城 百分之95 ...
- 耗时近一个月,终于录完了VUE.JS2.0前端视频教程!
这次课录制的比较辛苦,圣诞节时原本已经快录制完成了,偶然的一次,播放了一下,感觉不满意,好几篇推倒重来,所以今天才结束. vue.js2.0是Vue.JS的最新版本,视频教程还不多,如果你看到了,学到 ...
- vue 3.0 体验,vue 3.0新特性
前言 昨天不是尤雨溪 不是刚在B站 直播玩了,分享了vue-next v3.0.0-beta.1 版本 哈哈, 不要太刺激哦 6大亮点 Performance:性能更比Vue 2.0强. Tree s ...
- 后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_158 在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详 ...
- Vue.js2.0快速入门笔记
vue.js 解耦视图与数据,可复用的组件,前端路由,状态管理,虚拟DOM. MVVM模式:当View(视图层)变化时,会自动更新ViewModel(视图模型),View与ViewModel之间双向绑 ...
随机推荐
- 操作系统:Tails
Tor是一个网络 如今,Tor浏览器可能是Tor的代言人,但Tor的真正力量在于Tor网络.大家都知道,"Tor"实际上是"The Onion Router"( ...
- 149_1秒获取Power BI Pro帐号
一.背景 当你来到这篇文章的时候,我想你已经在网上搜索了一圈了.网上有一大把教你如何注册Power BI帐号的方法,我们这里就不在赘述了.因为各种因素的限制确实比较麻烦.我们直接提供Power BI ...
- 120_PowerBI堆积瀑布图_R脚本Visual
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.效果 二.data 三.添加字段 注意红色框标注地方 四.code # 下面用于创建数据帧并删除重复行的代码始终执行, ...
- css属性补充与JS数据类型
目录 溢出属性(overflow) 定位(position) z-index属性 opacity不透明度 JavaScript简介 变量与注释 数据类型 数值(Number) 字符串(String) ...
- TKE qGPU 通过 CRD 管理集群 GPU 卡资源
作者 刘旭,腾讯云高级工程师,专注容器云原生领域,有多年大规模 Kubernetes 集群管理经验,现负责腾讯云 GPU 容器的研发工作. 背景 目前 TKE 已提供基于 qGPU 的算力/显存强隔离 ...
- CMU 15-445 数据库课程第四课文字版 - 存储2
熟肉视频地址: CMU数据库管理系统课程[熟肉]4.数据库存储结构2(上) CMU数据库管理系统课程[熟肉]4.数据库存储结构2(下) 1. 面向日志的存储 上节课我们讲完了面向元组的存储,这节课从面 ...
- 『忘了再学』Shell基础 — 23、其他环境变量配置文件
目录 1.注销时生效的环境变量配置文件 2.其他配置文件 3.Shell登录信息相关文件 (1)/etc/issue文件说明 (2)/etc/issue.net文件说明 (3)/etc/motd文件说 ...
- Dev C++编写C/C++程序 出现[Error] ld returned 1 exit status报错分析及解决
debug系列第一弹,不知道大家写程序的时候是不是都遇到过如题的报错. 我本人是经常遇到这行熟悉的令人不知所措的报错,可能是我太笨了 有时候百度无果也差不到原因,那就汇总一下目前我遇到的情况吧--持续 ...
- 如何写一个全局的 Notice 组件?
下面将会实现这样的效果: 组件动态创建脚本: NotificationBanner.js import Vue from "vue"; import Notice from &qu ...
- kali渗透测试阅读目录
一.渗透测试介绍 渗透测试介绍及渗透环境配置 二.信息收集 kali 信息收集 三.漏洞扫描 kali 漏洞扫描 四.漏洞利用 kali msf漏洞利用