构建用户界面,其实就是把数据展示出来。React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。
当然是为了统一宇宙…这是不可能的.由于 React 的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。也就是说React是最流行的一门框架。
在社区方面,React由于诞生的较早,所以社区比较强大,一些常见的问题、坑、最优解决方案,文档、博客在社区中都是可以很方便就能找到的。而且是由强大Facebook进行维护的,安全可靠。
React 可以非常轻松地创建用户交互界面。为你应用的每一个状态设计简洁的视图,在数据改变时 React 也可以高效地更新渲染界面。
以前都是自己亲自操作dom,有了声明式,就是我们不用亲自做,只需去操作数据.
React 可以非常轻松地创建用户交互界面。为你应用的每一个状态设计简洁的视图,在数据改变时 React 也可以高效地更新渲染界面。
无论你现在正在使用什么技术栈,你都可以随时引入 React 开发新特性。
这里主要是React Native,混合应用,最接近原生应用;可以跨平台。体验会好一些;也能够调用硬件底层的API。
tree diff:新旧DOM树,逐层对比的方式,就叫做 tree diff,每当我们从前到后,把所有层的节点对比完后,必然能够找到那些 需要被更新的元素;
component diff:在对比每一层的时候,组件之间的对比,叫做 component diff;当对比组件的时候,如果两个组件的类型相同,则暂时认为这个组件不需要被更新,如果组件的类型不同,则立即将旧组件移除,新建一个组件,替换到被移除的位置;
element diff:在组件中,每个元素之间也要进行对比,那么,元素级别的对比,叫做 element diff;
React遵循从上到下的数据流向,即单向数据流。对于React来说:单向数据流与单一数据源限定了要想在组件中更新另一个组件的状态;需要进行状态提升。(可以类比vue利用$emit来子组件向父组件传值)
constructor(props) {
super(props)
this.state = {
}
}
import React, { Component } from 'react';
// 子组件,使用props来接收值
function Child(props){
return <div>{JSON.stringify(props)}</div>
}
// 父组件
class App extends Component {
constructor(props){
super(props)
this.state = {
val:[
{fatherValue:'这是我父组件内部的值,将其传给子组件',
childValue:'我组件接收了来自父组件的值'}
]
}
}
render() {
return (
<div className="App">
<Child {...this.state.val[0]}></Child>
</div>
);
}
}
static defaultProps = {
key:val
}
static propTypes = {
key: ReactTypes.string.isRequired
}
<button ref={'btn'}>按钮</button>
componentDidMount(){
console.log(this.refs.btn)
}
react这套包,是专门用来创建React组件、组件生命周期等这些东西的;react-dom里面主要封装了和 DOM 操作相关的包,比如,要把 组件渲染到页面上.
cnpm i react react-dom -S
import React from 'react'
import ReactDOM from 'react-dom'
var myH1 = React.createElement('h1', null, '这是一个大大的H1')
ReactDOM.render(myH1, document.getElementById('app'))
cnpm i babel-preset-react -D
var mydiv = <div>
<h1 title={mytitle + 'aaaaa'}>当做HTML代码编译</h1>
<p className="myp">如果要添加一个类,即class属性,必须使用className,因为class是关键字</p>
<label htmlFor="">label标签的 for 属性需要替换为 htmlFor</label>
{/* 这是多行注释,你肯定看不到我 */}
</div>
上面这是使用 jsx 语法创建的div元素;很好的诠释了语法规范。记住它,就记住了全世界…那是不可能的
用构造函数创建出来的组件:专业的名字叫做“无状态组件”;本质上讲:就是无state属性
function MyComponent () {
return <h2>工厂函数组件(简单组件)</h2>
}
如果要直接使用props,必须先定义,否则无法直接使用
export default function Hello(props) {
return <p>haha --- {props.name}</p>
}
用class关键字创建出来的组件:专业的名字叫做“有状态组件”;本质上讲:就是有state属性
class MyComponent2 extends React.Component {
render () {
console.log(this) // MyComponent2的实例对象
return <h2>ES6类组件(复杂组件)</h2>
}
}
constructor(props) {
super(props)
this.state = {
}
}
state组件自身内部可变化的数据;可以使用setState修改数据,可读可写;props从组件外部向内部传递的数据;组件内部只读不修改
感谢大家看到这里,可能大家已经开始从入门到…放弃;从开始到火化;为了将来能遨游太空,继续努力…
什么是组件的生命周期函数
组件的创建,运行,销毁的过程中,总是伴随着各种各样的事件;这些在组件特定时期,触发的事件,叫做组件的生命周期,也是生命钩子
三个生命周期状态
Mount:插入真实 DOM;Update:被重新渲染;Unmount:被移出真实 DOM
生命周期函数的流程
用来帮助快速创建一个基于该框架的模板项目
Create React App 是一个用于学习 React 的舒适环境,也是用 React 创建新的单页应用的最佳方式。
cnpm install -g create-react-app
create-react-app hello-react
cd hello-react
cnpm start
npm start
启动项目,文件修改将会自动更新npm test
在交互监视模式下启动测试运行程序npm run build
在生产环境中编译代码,并放在build目录中,能够正确的打包代码,并且优化,压缩,使用hash重命名文件npm run eject
这是一个单向操作,一旦你使用eject,那么就不能恢复了.如果你对create-react-app这个构建工具和配置项不满意,你可以在任何时候eject,从而导出可配置的模板.axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
fetch(url).then(function(response) {
return response.json()
}).then(function(data) {
console.log(data)
}).catch(function(e) {
console.log(e)
});
React-router提供了一些router的核心api,包括Router, Route, Switch等,但是它没有提供dom操作进行跳转的api。
React-router-dom提供了BrowserRouter, Route, Link等api;我们可以通过dom的事件控制路由。例如点击一个按钮进行跳转,大多数情况下我们是这种情况,所以在开发过程中,我们更多是使用React-router-dom。
material-uihttp://www.material-ui.com/#/)
mobile.ant.design
Ant Design of React
React的生命周期函数
create-react-app详解
yarn和npm
React配置跨域
fetch
react-router-dom
单向数据流和双向绑定各有什么优缺点
深入浅出React(四):虚拟DOM Diff算法解析
React 源码剖析系列 - 不可思议的 react diff
Promise
Promose神器