原文转载自「刘悦的技术博客」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的组件递归来实现无限级分类(递归层级结构)的更多相关文章

  1. 《vue.js2.0从入门到放弃》学习之路

    原文地址: Vue.js2.0从入门到放弃---入门实例(一):http://blog.csdn.net/u013182762/article/details/53021374 Vue.js2.0从入 ...

  2. vue.js2.0+elementui ——> 后台管理系统

    前言: 因为观察到vue.js的轻量以及实时更新数据的便捷性,于是新项目便决定使用vue.js2.0以及与之配套的elementui来完成.只是初次接触新框架,再使用过程中,遇见了各种各样“奇葩”的问 ...

  3. vue.js2.0实战(1):搭建开发环境及构建项目

    Vue.js学习系列: vue.js2.0实战(1):搭建开发环境及构建项目 https://my.oschina.net/brillantzhao/blog/1541638 vue.js2.0实战( ...

  4. 浅谈Vue.js2.0某些概念

    Vue.js2.0是一套构建用户界面的渐进式框架,目标是实现数据驱动和组件系统.   A 渐进式框架 Vue.js是一个提供MVVM数据双向绑定的库,只专注于UI层面,这是它的核心.它本身没有解决SP ...

  5. vue.js2.0 (简易)水果商城 vuex vant-ui

    vue.js2.0 (简易)水果商城 vuex vant-ui:https://segmentfault.com/a/1190000015690250 vue2.5全家桶 高仿vivo商城 百分之95 ...

  6. 耗时近一个月,终于录完了VUE.JS2.0前端视频教程!

    这次课录制的比较辛苦,圣诞节时原本已经快录制完成了,偶然的一次,播放了一下,感觉不满意,好几篇推倒重来,所以今天才结束. vue.js2.0是Vue.JS的最新版本,视频教程还不多,如果你看到了,学到 ...

  7. vue 3.0 体验,vue 3.0新特性

    前言 昨天不是尤雨溪 不是刚在B站 直播玩了,分享了vue-next v3.0.0-beta.1 版本 哈哈, 不要太刺激哦 6大亮点 Performance:性能更比Vue 2.0强. Tree s ...

  8. 后端Python3+Flask结合Socket.io配合前端Vue2.0实现简单全双工在线客服系统

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_158 在之前的一篇文章中:为美多商城(Django2.0.4)添加基于websocket的实时通信,主动推送,聊天室及客服系统,详 ...

  9. Vue.js2.0快速入门笔记

    vue.js 解耦视图与数据,可复用的组件,前端路由,状态管理,虚拟DOM. MVVM模式:当View(视图层)变化时,会自动更新ViewModel(视图模型),View与ViewModel之间双向绑 ...

随机推荐

  1. Angular中懒加载一个模块并动态创建显示该模块下声明的组件

    angular中支持可以通过路由来懒加载某些页面模块已达到减少首屏尺寸, 提高首屏加载速度的目的. 但是这种通过路由的方式有时候是无法满足需求的. 比如, 点击一个按钮后显示一行工具栏, 这个工具栏组 ...

  2. Ajax前后端交互——后端接收前端页面变量

    核心代码: app.py from flask import Flask, render_template, request, jsonify app = Flask(__name__) @app.r ...

  3. 安装Supervisor到CentOS(YUM)

    Supervisor是一个Linux下进程管理工具. Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为守护进程,并监控进程状态,异常退出时能自动重启,可以 ...

  4. yolov2学习笔记

    Yolov2学习笔记 yolov2在yolov1的基础上进行一系列改进: 1.比如Batch Normalization,High Resolution Classifier,使用Anchor Box ...

  5. STM32 CubeMx使用教程

    一.STM32CubeMX 简介 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,目的就是为了方便开发者, 允许用户使用图形化向导生成C 初始化代码,可以 ...

  6. Matplotlib的小入门

    Matplotlib专门用于开发2D图表(包括3D图表),在日常数据处理中经常需要运用到它,它的用法非常多样,这里记录一些基础用法,算是一个小入门,后面如果有更复杂的画图要求,再进一步学习. 如果有需 ...

  7. 关于mybatis的应用

    导入依赖 <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifact ...

  8. 管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程

    前言 在平常的后端项目开发中,状态机模式的使用其实没有大家想象中那么常见,笔者之前由于不在电商领域工作,很少在业务代码中用状态机来管理各种状态,一般都是手动get/set状态值.去年笔者进入了电商领域 ...

  9. SQL Server 2019企业版和标准版的区别?

    来源公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485400&idx=1&a ...

  10. 『忘了再学』Shell基础 — 29、AWK内置变量

    目录 1.AWK内置变量 2.练习说明 (1)$n变量练习 (2)FS变量练习 (3)NF变量和NR变量练习 3.总结: 1.AWK内置变量 AWK内置变量如下表: awk内置变量 作用 $0 代表目 ...