需求:做一个react框架的前端框架(包括路由,请求后端等),大概就是做一个左边导航右边显示组件页面的东西,ui为material-ui

环境:

软件:vscode

包含的知识点:使用路由来导航,使用axios来进行前后台的交互。

前端环境: node(懒用msi安装包,不懒就用zip安装包,性能上什么区别我也不知道)

步骤1:搭建项目框架start

1、使用create-react-app来搭建小框架(这时候遇到第一个问题,可能在公司中会遇到这种问题,即上篇文章https://www.cnblogs.com/heibo/p/12012357.html)

在你的npm能够使用之后

在vscode中操作,打开控制台,选定一个文件夹打开

a、输入命令npm install -g create-react-app下载脚手架的依赖

b、利用脚手架命令生成一个基本的react框架  npx  create-react-app my-app(项目名称)

  搭建项目框架end

步骤2:写页面start

2、写页面,也就是写组件

a、可以在src(写代码的主要的地方)下面新建文件夹page(个人习惯,可以新建其他名称的文件夹,或者根据自己喜好创建其他文件目录)

  注意:可以适当分页面,大的页面可以分成多个小的页面(即小组件),也可以不分,这个看个人习惯

  大概写react组件的格式很简单(目前看来)步骤如下

  1、搭建一个react组件的template

     因为自己没有用快捷键,所以我就把其他人的页面直接搬过来了,我一般直接复制粘贴第一个页面的模板,然后修改内容,或者是直接敲。所以就不扯这个快捷键的事情了。随便找了个设置快捷键和使用的链接https://blog.csdn.net/hbiao68/article/details/101113155, 感觉这种都差不多,没啥区别。然后直接生成的模板大约就是这样的(感觉跟java的哪些东西很像了),类比java的类

    import React from 'react';                                               //引入react的包,跟java一样,因为需要用到这里面的api嘛

    export default class 类的名称  extends React.Component{       //继承component类,因为继承他你这个才是个组件,才能有组件应有的功能

      //接下来是构造方法,这个跟java中的 构造方法差不多,就是父组件调用子组件的时候可以传递参数,然后根据参数来生成相对应的页面

      //如果说不需要父组件传递参数,那么这个可以省略。

      constructor(props){

      super(props);

      this.state={

         a:"我是黑子"

      }//这个构造方法和java不同的是,他既要拿到外界给的参数还需要初始化自己的属性(对比java的属性,官方好像叫做状态),如果都没有那就不用写了

      }

      //接下来就该创建页面了,其实感觉也挺简单的,其实当你会写普通的html,css,那么这个就会写了 

      render(){

        return({

          //这个里面就是你的html文件中body里面的部分,直接把你平时写的html中的东西扔进去就行了

          需要注意的点:

              1、我们的class不能写class,要写成className,为了规范化,不要再标签中写style,另外写一个文件引入就行了,在开头写上                    require("css文件的路径");如require("./nav.css")(因为我习惯于把组件和css文件放到一个文件夹下面,所以直接./css名称就行了)

               css就把我们平时写的css扔进去就行,和平时一样。

              2、引入图片不要直接src="路径",应该写成src={require("图片路径")},否则我们的react是不认的,好像这种静态文件都要这么引入                吧,css不也是这么引入的嘛。我也不知道为啥,可能是什么es6还是什么其他的什么东西的标准吧。

               以上是静态页面的书写组件的方式

               如果说加入了数据的话,需要在需要数据的地方加{里面是变量},这种看起来有点像java中的jsp了,静态页面直接写,数据的地方用               表达式,只不过这种是前端拿到数据自己渲染,jsp是后端去渲染,然后传到前端。如果说需要用循环遍历数据渲染页面的话,用数               组的map,将这种代码放到{}中,好像就是说当涉及到逻辑不是那种静态页面的话,都要用{}包裹住,去写逻辑,比如你需要循环渲染               一个ul列表,你可以这样写,

               render(){

                return(

                    <ul>

                    {

                    foodList.map(function(item,index)){//知道es6的都应该会写这个

            ·        return(<li><a href={item.url}></a>{item.name}</li>)   //嗯,这个需要渲染的变量是表达式,要写在{}里面

                    }

                    }//注意这里,是需要重复渲染的控件才需要写在这里面欧,其他的放外边就行

                    </ul>

                    //总之,你外边的+{}里面拼出来的是你想要的页面就行,如果多层循环,直接在需要重复渲染的位置写一个就行,这个是                    //可以嵌套的。map里面return的就是重复渲染的控件,加上{包裹的数据}

                    还有就是,如果你的数据需要处理可以在render函数里面,return之前处理就可以。这个没有问题。

                  )

                }

          }

        )

        }

    }

    这时候如果我们的大页面需要融合小页面的话,,总共要两步。1、把页面导入进来,import  子组件  from '子组件的路径'。2、在父页面的需要添加子页面的    地方进行添加。如

    import  Head from '../Head'

    <Head  /> 好像是在哪里看到的,我们的子组件第一个字母要大写,好像是为了区分html标签什么的,反正大写就没问题了。

    然后我们的render部分就写到这里,因为是初次接触懂得的可能很有限。

    这个东西给我的感觉就是他把那个小组件的render直接给塞到你写的位置了,为了显示正常,最好在外面套上一个div,这样的话就能防止小组件乱跑了。

  写页面end

步骤3、获取数据start

3、获取数据

  2步骤只能做一堆静态的页面,因为你还没有能够获取到外界的数据,这时候我们通过axios去获取接口中的数据

    1、导入axios的依赖,使用npm工具,npm install axios

    2、引入axios  import 'axios'  from axios(就跟java一样,你需要人家里面的方法/api,你就需要引入进来)

    你可以在适当的时候使用axios调用接口获得数据,如点击事件中等等,如果说第一次render需要axios获取的数据,我们可以在适当的生命周期中调用,以保证    在执行render时可以拿到新鲜的数据,我写在了componentWillMount中,但是这个生命周期好像不建议使用了,也可以写在我们的构造方法中。写法如下

    axios.get('./data.json')
     .then(function (response) {
       let data = response.data
       // console.info("我的数据是");
       that.setState({ navList: eval(data) });
     })
     .catch(function (error) {
       console.log(error);
     });//简单的一批,直接把你的请求地址替换,把请求到的数据放在state里面就可以了。如果是post请求那你就去找api(用api这个东西还是很简单的,网上应该    随手能够查到
)//查到我们的数据之后直接按照render中如何把数据放到页面中的方式弄进去,这个动态页面就有了

但是当你运行完之后,会发现你的请求数据会被浏览器拦截,这是浏览器的同源策略,就是说(不是同一ip,同一端口的信息之间是不能够通信的),这时候我们就需要解决跨域问题解决跨域问题的方法:

    安装依赖:http-proxy-middleware

    创建一个Js文件来配置跨域:如src/setupProxy.js

    引入这个依赖:const proxy = require("http-proxy-middleware");

    然后写上这个:

  module.exports = function(app) {
   app.use(
   proxy("/base/**", {//配置axios访问路径
   target: "http://45.32.15.21:8090/",//真正访问host,当访问的时候会拼接上这个组成真正的请求地址
   changeOrigin: true
   })
   );
  };
  详细请见某位大神的博客:(https://www.cnblogs.com/zhourongcode/p/10104366.html),跨域问题,我就是大概复制过来的

  获取数据end

步骤4、添加路由start

4、添加路由。

 直到第三步,我们只是写出了一大堆动态页面,但是他们并没有什么联系,所以我们需要添加路由来把这些页面关联起来。

 这个有两种,一种是页面内路由,一种是页面间跳转路由。解释一下:

 假如有两个大的页面,即登录页面和主页面,但是主页面是那种左边导航栏,右边是内容的那种。

 那么登录页面跳转到主页面就称为页面间跳转路由(感觉就是一级路由),主页面内容切换就是页面内路由(就是二级路由或者多级路由)

 以上应该是react-router 4之前的做法,就是将这种路由放在一个路由文件中,通过嵌套的方式来确定我们的一级路由或者n级路由,这样形成一个目录的形式

 但是在react-router 4开始我们就不分这种一级路由和多级路由了,react-router 4建议我们将路由写入页面中,他的大概思想是,你的页面应该显示在哪里,那么你的

  路由就应该写在哪里(这里包括一级路由和多级路由),当你刚刚接触这个思想的时候,可能有点别扭,但是当你理解这个东西的时候,这个路由会很好写。这时候 首先去掉你的router.js文件。

 其实主要的思想差不多就是:在可能需要渲染不同页面的地方,写router,来让react根据地址栏判断应该渲染那个组件,你可以想成if判断,在不需要改变的地方,就直接写页面。哇,这么解释是真滴抽象,举个例子:

 登录页和主页面

 在你刚刚输入什么http://localhost:3000的时候,react把<root></root>根组件渲染出来了(可以把<root>看成根路径),但是你希望根据地址来让react选择在root  div中渲染什么组件(感觉react路由的工作方式就是在适当的地方更换组件),如果这时候你在root中加上一个一堆route,这时候react就会去进行if判断,先看浏览器地址栏,react一看:"奥,是http://localhost:3000/main ,那我就去看看哪个是匹配的把",然后他发现root的route中正好有一个/main匹配了一个组件("http://localhost:3000"+"/main"=http://localhost:3000/main),react说:"我擦,怎么能这么匹配,那么就在root里面渲染这个组件吧",这时候就把这个组件渲染到了<root>div里面(需要知道的是,route在哪里定义,渲染到哪里,然后再根据你的路由地址,去匹配渲染哪一个组件),贴个代码:

这段代码是被挂载到root div下的,从脚手架这句话可以看出

当react渲染完root后,看到这下面有需要渲染的组件(div(不一定是div)下有route定义,那就有需要渲染的组件),那就先看浏览器导航栏地址,然后根据route定义来决定root下面应该渲染哪个组件,你可以将那两个route看成 java中的if      转换成java代码就是

String NavLink=浏览器地址栏地址字符串

String parentLink=访问把router包裹起来的那一层的地址字符串   //这一个是错的,不要看这个,看下面的那个,我以为react-router4的 路由 path,只需要写本层的,没想到是要写除了localhost:3000之外所有的

String parentLink=http://localhost:3000   //这个是对的,原来没有测试,后来发现跳转不正常

List<Route> Routes =那一堆Route定义

for(int i=0;i<Routes.size();i++){

String routeLink=Routes.get(i).path;

if(NavLink.equals(parentLink+routeLink)){

在包裹层的下面渲染Routes.get(i)

break;

}else{

continue;

}

}

就是这样的,反正就这么个意思吧,看不懂也没治了。

还有就是,只定义这个不行,需要有一个触发这个跳转的东西。目前发现有两种

1、react-router自带的LInk标签,在to属性中加入,对应路由的地址,也就是Route中的path属性

2、通过点击事件。调用这个方法:this.props.history.push('Route中的path'),也许link标签的点击事件就是这东西吧

this.props.history.push('/app')

做reacat小项目的过程(我感觉适合那种刚刚接触react感觉很深奥的亲们,通过这个可以建立一个很垃圾的项目,入门吧,往深处就需要自己再看了)的更多相关文章

  1. 再看GS接包过程

    再看GS接包过程 bool GameServer::ProcessLoop(packet& rPkt) { if(false == m_spDataLayer->Recv(rPkt)) ...

  2. mysql索引设计的注意事项(大量示例,收藏再看)

    mysql索引设计的注意事项(大量示例,收藏再看) 目录 一.索引的重要性 二.执行计划上的重要关注点 (1).全表扫描,检索行数 (2).key,using index(覆盖索引) (3).通过ke ...

  3. 再看Ajax

    再回顾Ajax相关的内容,再次梳理学习还是很有必要的,尤其是实际的开发中,ajax更是必不可少,仔细学习以便避免不必要的错误. 文章导读: --1.使用XMLHttpRequest---------- ...

  4. 再看JavaScript线程

    继上篇讨论了一些关于JavaScript线程的知识,我们不妨回过头再看看,是不是JavaScript就不能多线程呢?看下面一段很简单的代码(演示用,没考虑兼容问题): 代码判断一: <div i ...

  5. 再看C++引用类型

    之前弃用博客园的原因是其不支持markdown语法.到今天偶然进来试了一下,发现Markdown toggle原来是能支持的(不知道是不是因为它升级了),遂重新启用. 在一年前学C++的时候就对引用, ...

  6. 再看ExpressionTree,Emit,反射创建对象性能对比

    [前言] 前几日心血来潮想研究着做一个Spring框架,自然地就涉及到了Ioc容器对象创建的问题,研究怎么高性能地创建一个对象.第一联想到了Emit,兴致冲冲写了个Emit创建对象的工厂.在做性能测试 ...

  7. perf使用的问题,再看perf record,perf record 设置的采样频率,采样频率是如何体现在

    当perf stat -e branches 是统计 再看perf record,perf record是为了是记录时间发生的时候的调用栈, 在我的测试代码中总共有200,000,000条branch ...

  8. 再看GS线程

    再看GS线程 void GameServer::ProcessThreadTry() { ; packet rcvPkt; rcvPkt.data = * ]; //该事件工厂主要创建了两个定时器1. ...

  9. C#开发Activex控件(转载别人的只为再看时方便放在自己里边了)

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能, 以增强浏览器端的动态处理能力.通常ActiveX控件都 ...

随机推荐

  1. Consul 注册中心介绍

    在 Spring Cloud 体系中,几乎每个角色都会有两个以上的产品提供选择,比如在注册中心有:Eureka.Consul.zookeeper.etcd 等:网关的产品有 Zuul.Spring C ...

  2. 如何编写snort的检测规则

    如何编写snort的检测规则 2013年09月08日 ⁄ 综合 ⁄ 共 16976字 前言 snort是一个强大的轻量级的网络入侵检测系统.它具有实时数据流量分析和日志IP网络数据包的能力,能够进行协 ...

  3. Hibernate更新、删除后数据库无变化

    转自:https://ask.csdn.net/questions/756109 !-- 配置事务管理器 --> <tx:advice id="advice" tran ...

  4. DB2新建编目及删除编目

    场景:在添加一个新数据库的连接时,需要先建立此数据库的编目信息 新建: 1.获取数据库IP.端口.数据库名称 2.打开DB2客户端的“DB2命令窗口” 3.按以下命令执行 db2 catalog tc ...

  5. DNS服务——域名解析转发 和 条件转发

    前言 有一台Linux机器作为DNS服务器,查看这台机器上的DNS文件,发现指向互联网上的DNS服务器. [root@ziqiang named]# cat /etc/resolv.conf # Ge ...

  6. Redis 从入门到放弃

    Redis 从入门到放弃 http://www.iocoder.cn/Fight/Redis-went-from-getting-started-to-quitting/

  7. zookeeper学习(3)----基本结构和命令行操作命令

    一. 数据结构 https://www.jianshu.com/p/8e322462bcca zookeeper存储结构:以树形结构的方式存储数据 ZooKeeper数据模型的结构整体上可以看作是一棵 ...

  8. Thread.sleep()和Thread.currentThread().sleep()区别

    先看一下代码 public class Thread1 extends Thread{ @Override public void run() { try { System.out.println(& ...

  9. JavaScript异步学习笔记——主线程和任务队列

    任务队列 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务.如果前一个任务耗时很长,后一个任务就不得不一直等着. 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕, ...

  10. Codeforces Round #609 (Div. 2) C. Long Beautiful Integer

    链接: https://codeforces.com/contest/1269/problem/C 题意: You are given an integer x of n digits a1,a2,- ...