当前位置: 首页 > 后端技术 > Python

Django+React全栈开发:界面优化

时间:2023-03-26 01:09:33 Python

时间处理很多博客只会在文章列表界面显示自文章发表以来的时间(如下图)。之前,我们粗暴的从后台返回了ISO8601格式的时间字符串显示出来,现在我们来处理一下。首先我们看看后台数据经过rest_framework序列化后是什么样子的:2020-04-05T11:10:56.880622+08:00。要得到这样的带时区的时间,需要更改Django设置,找到backend/backend/settings.py,找到下面两个变量修改:#对了,也可以更改语言设置LANGUAGE_CODE='zh-hans'#时区是上海,AsiaTIME_ZONE='Asia/Shanghai'这里我们可以使用moment.js来处理时间,现在来到前端部分,打开react_drf/frontend目录,使用yarn安装依赖,并运行命令yarnaddmoment。为了直接看到效果,不要忘记同时启动前后端程序。现在修改frontend/src/ArticleList.js:importReact,{Component}from"react";importmomentfrom'moment';importmomentLocalefrom'moment/locale/zh-cn';//importmoment.js并设置语言moment.updateLocale('zh-cn',momentLocale);......render(){return({this.state.articleList.map(item=>........创建时间:{moment(item.created).fromNow()}{''}更新时间:{moment(item.updated).fromNow()}em>

)}
);现在打开浏览器,浏览localhost:3000,可以看到和上图一样的效果。注意:moment在我们要实现的功能上的使用是大锤。我最近刚看到这个库,所以尝试使用它。请注意,有一行{''},它实际上是使用JSX为呈现的HTML添加一个空格。我们在条件渲染之前定义的名为articleList的数组对象还在代码中,但实际上我们并不需要它,我们的文章数据是从后台API中获取的。现在删除原来定义articleList部分的代码,在我们类组件ArticleList的构造函数中修改如下部分:constructor(props){super(props);this.state={//将状态中的内容改为空数组articleList:[],};}......现在让我们关注组件中的渲染函数:render(){const{articleList}=this.state;......}添加这行代码,直接从this.state对象中取出articleList,这样之前JSX中的this.state.articleList可以直接简写为articleList。目前在本地环境下,我们获取API的速度非常快,而且数据量很小,所以如果网络不好的时候后台数据还没有取到,那我们的页面当然不可能是空白的吧?修改render函数的返回值如下:return((Array.isArray(articleList)&&articleList.length===0)?

Loading...

:{articleList.map(item=>

{item.title}

{item.body}
创建:{moment(item.created).fromNow()}{''}更新:{moment(item.updated).fromNow()}

)}
);这里我们使用了JSX中的三元运算符,代码很简单,就是当articleList数组不为空时显示文章列表,否则渲染

loading...

。但是在JS中判断一个数组是否为空有一些坑,比如arr==[]或者arr===[]只会返回false。(PS:又忍不住想吐槽JS了。。。现在打开浏览器刷新,但是因为这里获取数据的速度非常快,所以“loading”几个字一闪而过,整个componentDidMount函数都可以注释掉看看效果。这就是React中的条件渲染。组件的渲染可以根据情况决定。目前我们的页面还是很简单的。以后我们在添加导航栏、侧边栏等元素的时候,你肯定不想去获取它,让页面空空如也。小练习:尝试让组件在网络出现故障时呈现出与平常不同的渲染方式。提示对代码进行如下改动,将fetch捕获的错误设置到this.state中。完成练习后,暂停Django以验证您是否做对了。构造函数(道具){超级(道具);this.state={文章列表:[],错误:null,};}componentDidMount(){fetch('/articles/').......catch(e=>this.setState({error:e}));}添加样式你可能已经发现,在frontend/src目录下,除了后缀为js的文件外,还有一个同名的后缀为css的文件。打开App.js看一下(如果你没删),也可以找到import'./App.css';代码行。现在我们也写一个ArticleList.css:.ArticleList{text-align:center;}只是一个文本对齐显示。请注意,我们已经在组件渲染函数的JSX中定义了div元素的类名。现在只需在App.js中导入样式文件并添加import'./ArticleList.css';在代码的顶部。您现在可以看到文本位于页面的中央。也可以直接在JSX中设置样式,例如:{item.title}现在可以看到标题变成红色了。欢迎关注我的公众号《公子正的日常》,原创技术文章第一时间推送。