django获取div id_Django+React全栈开发:路由
react-router
现在的网站一般来讲很少只有单个“页面”,对于我们的博客来说,除了文章列表的界面,起码还得得有个文章详情页才行。
单页应用(SPA):可能你在官方介绍create-react-app
这个脚手架时已经看到了这个名词(注意不是做按摩的那个spa啊),但千万不要误以为单页面的意思是没有“可以点击的链接”的。在这里所说的单页应用实际上就是:既然我们将一个网页应用看作一堆组件的组合,那么动态的页面其实只需要动态更新显示部分组件就行,而不是像传统做法那样,把整个页面都刷新,所有资源都重新加载。
好了,看到这里你应该明白,create-react-app
是一个适于构建单页应用的脚手架,但不意味着想要做一个文章详情页就要再次yarn create react-app
新建一个项目了吧。
好了,说了这么多,开始写代码吧。这里我们需要学习一个新东西:react-router-dom
。首先进入我们的react_drf/frontend
目录,终端运行yarn add react-router-dom
来安装依赖。
函数组件
之前我们已经讲过了类组件,在React
中我们也可以创建函数形式的组件,函数组件又称为无状态组件,它可以接收一个props
作为参数,但是不可以使用state
,它没有状态,也没有生命周期函数(在本教程介绍React Hooks
之前这句话是正确的)。
为了介绍函数组件,这里先拆分一下组件,从ArticleList
拆出一个ArticleItem
。
const ArticleItem = props => (
// 这一部分从ArticleList复制过来<div key={props.item.id}><h4 style={{ color: "red" }}>{props.item.title}</h4><p><strong>{props.item.body}</strong><br/><em>创建时间:{moment(props.item.created).fromNow()}</em>{' '}<em>更新时间:{moment(props.item.updated).fromNow()}</em></p></div>
)
这里使用了箭头函数,要了解这些基础知识的细节,推荐去看MDN
、阮一峰的ES6入门教程
或者现代JavaScript教程
。
ArticleItem
组件的内容是从ArticleList
复制过来的,那么现在去修改ArticleList
的内容:
......<div className="ArticleList">{articleList.map((item) =><ArticleItem item={item} />)}</div>......
我们将aritcleList
中的元素当作ArticleItem
的props
传递下去。可以看到这里的ArticleItem
组件就是一个函数,它的返回值就是要渲染的内容。
路由
在开始写代码之前,让我们先来构思一下路由划分。
首先我们看到,三张图中都有的共同点是都有最外层的矩形框以及导航栏这个矩形框。当点击home
时url
为/
,此时显示第一张图的样式,点击about
跳转到/about
,显示第二张图的样式,如果点击了某个ArticleItem
的标题,则进入/articles/articleId
,显示第三张图的样式。
所以,我们需要一个最外层的组件,可以利用之前的App
,App
中固定包含导航栏,当然这也可以作为Nav
组件被拆分出来,接着是包含ArticleList
和ArticleItem
组件的Home
组件,另外还有About
组件以及ArticleDetail
组件。
首先改写App.js
:
import React from 'react';
import './App.css';
import ArticleList from "./ArticleList";
import {Switch,Link,Route
} from "react-router-dom";
import About from "./About";
import ArticleDetail from "./ArticleDetail";const Home = () =><ArticleList />function App() {return (<div className="App"><header><nav><ul><li><Link to="/">Home</Link></li><li><Link to="/about">About</Link></li></ul></nav></header><hr /><Switch><Route path="/about"><About /></Route><Route path="/articles/:articleId"><ArticleDetail /></Route><Route exact path="/"><Home /></Route></Switch></div>);
}export default App;
首先这里引入了react-router-dom
中的三个组件,Link
组件用于创建链接,Switch
和Route
搭配使用,Switch
会搜索子元素Route
,当找到其路径与当前url
相匹配的Route
时,则渲染此Route
内容,并忽略其它的Route
。例如当前url
为根路径/
,那么就会渲染这里最后一个Route
中的Home
,这里由于Home
中暂时没有其它元素,我直接将它定义在了App.js
。
注意到这里有个/articles/:articleId
的路由,这是到文章详情页的链接,这里引入的ArticleDetail
和About
两个组件我们稍后完成。
别忘了在之前的index.js
中我们渲染的是ArticleList
,现在去更改它:
......
import { BrowserRouter } from "react-router-dom";ReactDOM.render(<React.StrictMode><BrowserRouter><App /></BrowserRouter></React.StrictMode>,document.getElementById('root')
);
要使用react-router-dom
的路由,还需要在App
外套上BrowserRouter
。
现在去修改ArticleList.js
,让其根据文章ID创建不同的Link
:
......
import { Link } from "react-router-dom";......const ArticleItem = props => (<div key={props.item.id}><Link to={`/articles/${props.item.id}`}><h4 style={{ color: "red" }}>{props.item.title}</h4></Link>......</div>
)class ArticleList extends Component {
......
}
我们使用ES6
语法的模板字符串,注意<Link to={
/articles/${props.item.id}}>
里的不是单引号,而是键盘左上角esc键下面那个反引号。这和Python
中的f
字符串有些类似,都允许在字符串中嵌入变量,但是ES6
的写起来有点麻烦。JSX
的实现也离不开模板字符串哦。
OK,现在让我们在src
目录下新建两个文件ArticleDetail.js
和About.js
:
// ArticleDetail.js
import React from "react";
import { useParams } from 'react-router-dom';const ArticleDetail = () => {
// 取出url中的参数const { articleId } = useParams();return (<div>article {articleId}</div>)
}export default ArticleDetail
// About.js
import React from "react";const About = () =><div>这是我的博客</div>export default About
现在使用yarn start
启动应用,别忘了Django
应用也要启动哦,否则看不到文章啦。现在在网页上点击文章标题或者导航栏的链接试试看吧。
练习
现在我们的文章详情组件只是简单地显示了article + id
,请你尝试重写组件以显示真正的文章详情,这篇文章不讲Hooks
(其实我们已经不知不觉中使用过了),所以你可能要将ArticleDetail
改写为类组件,并通过props
传递id
并在componentDidMount
中请求API。
欢迎关注我的公众号“公子政的宅日常”,原创技术文章第一时间推送。
django获取div id_Django+React全栈开发:路由相关推荐
- jsonp react 获取返回值_Django+React全栈开发:文章列表
React 现在我们有了一个属于文章的API,可以添加.修改.删除.查看文章,但是对于我们的网站来说,还需要一个用户界面才行.现在开始探索一下ReactJS吧. 经常听到有前端三大框架Angular. ...
- React全栈之Instagram开源视频教程
这个冬天特别的寒冷且慢长,终于可以静下心来,做一些开源工作.读了zhoushaw老师的 打造属于你自己的instagram! 全栈项目(react + egg.js)项目, 非常喜欢, 于是决定为此开 ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...
python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...
- 【笔记-node】《Egg.js框架入门与实战》、《用 React+React Hook+Egg 造轮子 全栈开发旅游电商应用》
20210226-20210227:<Egg.js框架入门与实战> 课程地址:https://www.imooc.com/learn/1185 第一章 课程导学 01-01 课程介绍 一. ...
- Django银角大王武沛齐配套视频笔记,python全栈开发、pythonWeb
Django 本套博客基于银角大王武沛齐的django全栈开发视频编写:传送门 如有错误或改进欢迎大家评论.私信交流指正 一.初识Django 1.Djang的安装 在windos命令窗口 win+r ...
- python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)
python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv) 一.上传文件 上传一个图片 使用input type="file& ...
- 2017年成为全栈开发工程师的权威指南
http://www.css88.com/archives/7529?utm_source=tuicool&utm_medium=referral 根据 2016年 Stack Overflo ...
- python 全栈开发,Day103(微信消息推送,结算中心业务流程)
python 全栈开发,Day103(微信消息推送,结算中心业务流程) 昨日内容回顾 第一部分:考试题(Python基础)第二部分:路飞相关 1. 是否遇到bug?难解决的技术点?印象深刻的事?- o ...
- python 全栈开发,Day32(知识回顾,网络编程基础)
python 全栈开发,Day32(知识回顾,网络编程基础) 一.知识回顾 正则模块 正则表达式 元字符 :. 匹配除了回车以外的所有字符\w 数字字母下划线\d 数字\n \s \t 回车 空格 和 ...
最新文章
- 在C++平台上部署PyTorch模型流程+踩坑实录
- pip国内常用源及配置方式
- 设计模式(四)简单工厂模式
- C语言进阶--Day2
- MySQL数据库-笔记01【数据库概念、数据库安装、终端操作数据库】
- CentOS7中yum安装mysql_CentOS7中YUM 安装mysql
- mysql清理 frm_通过.frm .ibd文件恢复MySQL数据
- 02繁花嗅Django笔记
- java多线程通信基础(面向厕所编程)
- Flink部署、使用、原理简介
- KVM Disk Cache简析
- onenote组织知识体系_我们的家人教给我们有关组织生活的知识
- [k8s]容器化node-expolore(9100)+cadvisor(8080)+prometheus(9090) metric搜集,grafana展示
- android判断循环,android kotlin学习之路 kotlin中的分支判断与循环判断(2)
- FastReport动态改变字体颜色
- 牛客Steins;Gate(原根+FFT)
- docker portainer agent 安装
- UE4中英文语言切换的三种方式(当然也可以多种语言)
- php 获取中英文字符的数量;和JS获取中英文字符的数量
- 适合环保工程行业的项目管理软件