React技术栈

传统Web前端

传统编写前端网页大三大技术,HTML、CSS、JavaScript(以及以JavaScript为基础所封装的第三方库,比如:JQuery等)

HTML

HTML 是用来描述网页的一种语言,超文本标记语言 (Hyper Text Markup Language);
标记语言是一套标记标签 ,HTML 使用标记标签来描述网页,构建网页的基本骨架;
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。

HTML DOM树

CSS

CSS 指层叠样式表 (Cascading Style Sheets),定义显示 HTML 元素的方式;
HTML 标签被设计为用于定义文档内容。通过使用 <h1>、<p>、<table> 这样的标签,HTML 的初衷是表达“这是标题”、“这是段落”、“这是表格”之类的信息。最终由浏览器渲染到页面,但是这些标签只能按默认样式,和流动布局的方式渲染。
CSS则通过盒模型选择器定位层叠样式等技术为网页内容添加格式

JavaScript

JavaScript 是轻量级的脚本语言,可插入 HTML 页面,插入 HTML 页面后,可由所有的现代浏览器执行。
JS能够获得页面的文档对象树,从而获得页面中的DOM对象,再通过内部封装的函数来操作这些DOM对象。
另外JS还封装了关于HTTP请求和响应的函数,实现页面发送和响应HTTP请求

HTML+CSS+JavaScript

通过这三个技术就能实现前端页面的内容填充,样式布局,交互响应等所有内容。项目中页面就由page1.html、page1.css、page1.js三者组成。页面的内容是整体加载与渲染的。

React组件化模式下的Web前端

React则另辟蹊径提出了以组件化的形式重新构建页面内容,所谓组件就是将页面的内容按特征分块,然后将特定块中的HTML、CSS、JS封装在一起,最后用组件来构建页面内容。然而React不是一个完整的MVC,它只是V,也就是视图表现,采用React搭建完整的页面还需要其它技术支持:npm、ES6、JSX、bable、less、Router、Redux、WebPack

React

React 是一个采用声明式,高效而且灵活的用来构建用户界面的框架。
(下面是个人理解的说法)
每一个React组件既是一个ES6对象,对象内部可以有属性和方法,从而更好的操作组件内部的页面元素。
React为了统一检测变化,为每个React组件定义了两个固定属性,prop和state,prop是react父组件在使用react组件时所传入的属性,是由外部赋值的,而state只能通过内部的构造函数和setState方法赋值和修改。

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

function App() {
  return (
    <div>
      <Welcome name="Sara" />
      <Welcome name="Cahal" />
      <Welcome name="Edite" />
    </div>
  );
}

ReactDOM.render(
  <App />,
  document.getElementById('root')
);
图片.png

例如:

class App extends Component {
  constructor(props){
    super(props);
    this.onClickButton = this.onClickButton.bind(this);
    this.state = {count : 0};
  }

  onClickButton(){
    this.setState({
      count : this.state.count + 1
    });
  }
  render() {
    return (
      <div>
        <button id="btn_click" type="button" onClick={this.onClickButton}>click me</button>
        <span id="value">{this.state.count}</span>
      </div>
    );
  }
}

而通过JQuery代码则是:

<body>
    <button id="btn_click" type="button" name="button">click me</button>
    <span id="value">0</span>

    <script src="./jquery-3.2.1.js" charset="utf-8"></script>
    <script type="text/javascript">
      $(function(){
        $("#btn_click").click(function(event) {
          /* Act on the event */
          var clickCounter = $("#value");
          var count = parseInt(clickCounter.text(),10);
          clickCounter.text(count+1);
        });
      })
    </script>
  </body>

对比可以看出来传统JQuery方式需要的到具体的DOM对象,然后进行操作,而React组件方式只需要更改对象内的state属性,不需要操作DOM元素。

npm

NPM(node package manager),通常称为node包管理器。顾名思义,它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。
npm的背后,是基于couchdb的一个数据库,详细记录了每个包的信息,包括作者、版本、依赖、授权信息等。它的一个很重要的作用就是:将开发者从繁琐的包管理工作(版本、依赖等)中解放出来,更加专注于功能的开发。

Node.js 就是运行在服务端的 JavaScript,是一个基于Chrome JavaScript 运行时建立的一个平台,赋予了JavaScript很多面向对象语言的特性
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

ES6、JSX、bable

ES6即ECMAScript 2015,是 JavaScript 语言的下一代标准,它和JavaScript的关系就是,JS是ES的一种实现。
ES6中有很多新的特性,比如箭头函数、匹配赋值等,使的其更像是一门面向对象的语言。
目前主流的浏览器还不支持ES6,所以需要通过转码器将ES6转为ES5,bable就是目前主流的转码器
JSX就是Javascript和XML结合的一种格式。传统的Web中HTML,CSS,JS一般是分开的,便于管理,要想在HTML中嵌套JS和CSS需要特定格式,而JSX就等价于这种规则。React发明了JSX,利用HTML语法来创建虚拟DOM。当遇到“</>”,JSX就当HTML解析,遇到“{}”就当JavaScript解析。
例如:

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

less或者Sass

Less (Leaner Style Sheets 的缩写) 是一门向后兼容的 CSS 扩展语言。他丰富了css选择器的种类,使程序员能够在css中定义变量,函数,减少了css编写的代码量。同时他还支持选择器之间的嵌套,这样css更有逻辑,更易维护,也更符合React组件化的思想,我们可以将一个React组件显得选择器封装在一个嵌套层中,这样逻辑更加清晰。

@width: 10px;
@height: @width + 10px;
.bordered {
  border-top: dotted 1px black;
  border-bottom: solid 2px black;
}
#header {
  color: black;
  .bordered();
  .navigation {
    font-size: 12px;
  }
  .logo {
    width: @width;
    height: @height;
  }
}

Router

前面讲了React是组件化的开发,小组件构成大组件,大组件构成更大的组件,整个网页页面也成了一个组件,那么怎么实现页面的跳转呢?
传统的web前端可以通过HTML文件的路径来跳转,而React中都是组件,那么就不能通过传统的方式来跳转了,这时候Router就来了,他就是来解决这个问题的。
React Router 是一个基于 React 之上的强大路由库,它可以让你向应用中快速地添加视图和数据流,同时保持页面与 URL 间的同步。

import React from 'react'
import { render } from 'react-dom'

// 首先我们需要导入一些组件...
import { Router, Route, Link } from 'react-router'
const About = React.createClass({/*...*/})
// 新建一个组件让其在 Inbox 内部渲染
const Message = React.createClass({
  render() {
    return <h3>Message</h3>
  }
})

const Inbox = React.createClass({
  render() {
    return (
      <div>
        <h2>Inbox</h2>
        {/* 渲染这个 child 路由组件 */}
        {this.props.children || "Welcome to your Inbox"}
      </div>
    )
  }
})


// 然后我们从应用中删除一堆代码和
// 增加一些 <Link> 元素...
const App = React.createClass({
  render() {
    return (
      <div>
        <h1>App</h1>
        {/* 把 <a> 变成 <Link> */}
        <ul>
          <li><Link to="/about">About</Link></li>
          <li><Link to="/inbox">Inbox</Link></li>
        </ul>

        {/*
          接着用 `this.props.children` 替换 `<Child>`
          router 会帮我们找到这个 children
        */}
        {this.props.children}
      </div>
    )
  }
})

// 最后,我们用一些 <Route> 来渲染 <Router>。
// 这些就是路由提供的我们想要的东西。

React.render((
  <Router>
    <Route path="/" component={App}>
      <Route path="about" component={About} />
      <Route path="inbox" component={Inbox}>
        {/* 添加一个路由,嵌套进我们想要嵌套的 UI 里 */}
        <Route path="messages/:id" component={Message} />
      </Route>
    </Route>
  </Router>
), document.body)

Router还提供了<Link/>等组件方便使用,具体参考官方文档

Redux

Redux本不是为了方便React而出现的,React项目中也可以不使用Redux,相反在小项目中使用Redux反而会增加项目的复杂度。但是在大型前端项目中,Redux则能够很好地管理网站中的状态。
Redux 是 JavaScript 状态容器,提供可预测化的状态管理。随着 JavaScript 单页应用开发日趋复杂,JavaScript 需要管理比任何时候都要多的 state (状态)。 这些 state 可能包括服务器响应、缓存数据、本地生成尚未持久化到服务器的数据,也包括 UI 状态,如激活的路由,被选中的标签,是否显示加载动效或者分页器等等。
管理不断变化的 state 非常困难。如果一个 model 的变化会引起另一个 model 变化,那么当 view 变化时,就可能引起对应 model 以及另一个 model 的变化,依次地,可能会引起另一个 view 的变化。直至你搞不清楚到底发生了什么。state 在什么时候,由于什么原因,如何变化已然不受控制。 当系统变得错综复杂的时候,想重现问题或者添加新功能就会变得举步维艰。
Redux将所有的state构建为state树,保存到一个对象中;将所有可能的行为封装到action中,然后编写reducer函数分别处理action,根据action的种类来更改state从而实现state的管理和控制。这就是Redux的核心思想。


1537496555704.jpg

webpack

图片.png

Webpack的工作方式是:把你的项目当做一个整体,通过一个给定的主文件(如:index.js),Webpack将从这个文件开始找到你的项目的所有依赖文件,使用loaders处理它们,最后打包为一个(或多个)浏览器可识别的JavaScript文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容