文章涉及的内容可能不全面,但量不少,须要慢慢看。我花了很长的时间整理,用心分享心得,但愿对你们有所帮助。可是不免会有打字的错误或理解的错误点,但愿发现的能够邮箱告诉我1163675970@qq.com,我会及时的进行修改,只但愿对你有所帮助,谢谢。javascript
React 是一个由 facebook 开源的 前端框架,核心专一于视图,目的是实现组件化开发;css
咱们能够很直观的将有一个复杂的页面分割成若干个独立的组件,每一个组件包含本身的 html 结构、样式和js逻辑,而后再将这些组件组合,便可完成一个复杂的页面。这样既减小了逻辑的复杂度,又实现了代码的重用;html
1.安装 react 的脚手架 create-react-app :前端
npm install create-react-app -g
复制代码
2.使用 react 脚手架初始化一个项目:create-react-app 项目名,例如 :vue
create-react-app first-app
复制代码
3.等待依赖安装完成,而后执行:java
cd first-app
npm start
复制代码
react由两部分组成:node
须要咱们处理的是react
看图webpack
https://create-react-app.dev
复制代码
全局环境安装脚手架git
$ npm install -g create-react-app
复制代码
基于脚手架快速构建工程化的项目
$ create-react-app xxx (若是电脑上安装了yarn,默认基于yarn安装)
复制代码
不想安装在全局,能够基于npx一步到位 $ npx create-react-app xxx
|- node_modules 全部安装的模块
|- public
|- index.html SPA单页面应用中,各组件最后合并渲染完成的结果都会放入到页面的#root盒子中呈现
|- xxx.html MPA/SPA这里存放的是最后编译页面的模板
|- 咱们还可能会在此放一些公共资源,把这些资源直接基于SRC/LINK的方式调入到页面模板中,而不是基于webpack最后合并在一块儿(不建议:可是项目中,可能存在一些木块不支持CommonJS/ES6Module规范,此时咱们只能在这里直接引入使用了)
|- src 整个项目的大部分源码都写在这个目录下
|- index.js 项目的入口,webpack从这个文件开始导入打包(MPA中须要建立多入口文件)
|- api 数据处理
|- store REDUX公共状态管理的
|- assets 存储公共资源的(图片和样式)
|- utils 公共的JS模块
|- routes 路由管理的
|- components 公共的组件
|- ...
|- package.json
复制代码
若是执行yarn start/build 提示少模块,咱们则少了谁就安装谁
|- scripts
|- start.js => $ yarn start
|- build.js => $ yarn build
|- config
|- 这里存储的就是webpack的配置项
复制代码
PACKAGE.JSON
"scripts": {
"startMac": "PORT=8081 node scripts/start.js",
"start": "set PORT=8081&&set HOST=127.0.0.1&&set HTTPS=true&&node scripts/start.js",
"build": "node scripts/build.js"
},
复制代码
修改less的处理配置
config/webpack.config.js
const cssRegex = /\.(css|less)$/;
{
test: cssRegex,
exclude: cssModuleRegex,
use: getStyleLoaders({
importLoaders: 1,
sourceMap: isEnvProduction && shouldUseSourceMap,
}, "less-loader"),
// Don't consider CSS imports dead code even if the // containing package claims to have no side effects. // Remove this when webpack adds a warning or an error for this. // See https://github.com/webpack/webpack/issues/6571 sideEffects: true, }, 复制代码
jsx 语法是一种 js 和 HTML 混写的语法,将组件的结构,数据甚至样式都聚合在一块儿定义组件,最终通过编译造成普通的 javascript;
在 jsx 中,长得像 HTML 元素的就是 react 元素,React 使用 jsx 语法开发,学习 React 须要掌握 jsx 语法;
jsx 能够写在 js 文件中,也能够新建 .jsx 文件;可是在 js 文件中须要导入 React
import React from 'react';
// 导入 React 以后才能开始写 jsx 语法
复制代码
import React from 'react'
import ReactDOM from 'react-dom'
let data = {
name: '帅哥',
age: 18
};
let h = <h1 id="xyz">姓名:{ data.name }, 年龄:{ data.age }</h1>; // 这个 h 就是一个 react 元素,也能够成jsx元素,这个元素是虚拟DOM(js对象)
// 把 react 元素渲染到页面中
ReactDOM.render(h, document.querySelector('#root'), () => {
console.log('100');
console.log(document.getElementById('xyz'))
});
复制代码
JSX 元素须要放到 ReactDOM.render() 函数中,且最外层只能有一个根节点;
须要注意 jsx 是js,写 jsx 需注意遵照 js 的语法;
jsx 元素能够经过 { } 来使用表达式,注意只能是表达式,不容许写语句
jsx 元素一样可使用行内属性,可是 原来 html 行内的 class 属性,在 jsx 中有特殊意义,须要改为 className ;原有的 label 的 for 属性,须要改为 htmlFor ; style属性要写成对象的形式
jsx 元素(react元素)并非真正的 DOM,而是虚拟 DOM ,最终通过 babel 编译成普通js的对象;
示例:
let d1 = <div className="x1">这是一个div { false ? 1 : 0 }</div>
let d2 = (<div className={ false ? 'x1' : 'y1' }> 这是一个div <p>这里面减值能够写一个html</p> </div>); // 若是换行用小括号包裹起来
let d3 = <div style={{color: 'red', background: '#000'}}>11111<label htmlFor="name"><input type="text" defaultValue={data.name} id="name" /></label></div>; ReactDOM.render(d3, document.getElementById('root')); 复制代码
在 react 中使用样式,直接在 js 中经过 import 导入 css 样式;最终打包的时候,webpack 会帮咱们把样式处理好;
示例
import React from 'react'
import ReactDOM from 'react-dom'
import './css/3-css.css' // 在 react 中使用样式,直接在 js 中经过 import 导入 css 样式
let p1 = <p className="p1">这是一个p标签</p>; // 注意不能使用 class 指定元素类名,而应该使用 className 属性
ReactDOM.render(p1, document.querySelector('#root'));
复制代码
React 和 Vue 相似都是数据驱动的,均可以根据给定的数据生成一组 DOM 元素,或者根据数据的特定状况生成或者不生成 DOM 元素;在 Vue 中使用 v-for 指令,可是 React 没有指令系统,须要使用 数组的 map 方法,在 map方法的回调函数中返回要生成的 jsx 元素;
示例
import React from 'react'
import ReactDOM from 'react-dom'
let ary = [
{
name: '瘦大大',
age: 18,
title: '宇宙集团军总司令'
},
{
name: '胖小小',
age: 17,
title: '银河小魔仙'
}
];
// 在 Vue 中使用 v-for,可是 React 中没有指令
// 在 React 中使用列表渲染,须要使用 数组的 map 方法,在 map 方法的回调函数中返回要生成多个的元素;
// 使用传统的匿名函数:
let lis = ary.map(function (item, index) {
return <li key={index}>姓名:{item.name};年龄:{item.age};职务:{item.title}</li>
}); // map 方法将原数组映射成一个新数组,
console.log(lis); // 虚拟 DOM 数组
let ul = (<ul> {lis} {/*使用列表渲染出来的数据,在 html 里面使用须要使用 { lis }*/} </ul>);
// 使用 箭头函数
let ul2 = (<ol> { ary.map((item, index) => <li key={index}>name: {item.name}; age: {item.age}; title: {item.title}</li>) } </ol>);
ReactDOM.render(ul2, document.querySelector('#root'));
复制代码
条件渲染
React 一样没有 v-if,可是须要条件渲染,就须要使用 if-else 等判断语句
示例
let flag = Math.round(Math.random() * 10)
let el;
if (flag > 5) {
el = <h1>大于5</h1>
} else {
el = <h1> 小于等于 5</h1>
}
复制代码
React.createElement() 方法是用来建立虚拟 DOM 的方法,而 jsx 语法中,jsx 元素就是 createElement 方法的语法糖;
示例
import React from 'react';
import ReactDOM from 'react-dom';
let ele = (<h1 x="1" y="2"> hello <span s="1">1</span> <span>2</span> </h1>);
let eleByCreateElement = React.createElement(
'h1',
{x: 1, y: 2},
'hello',
React.createElement('span', {s: 1}, 1),
React.createElement('span', null, 2)
);
// React.createElement(type, props, ...children)
// type: 标签类型
// props: 行内属性,对象数据类型
// children: 从第三个参数开始都是 type 的子元素
ReactDOM.render(eleByCreateElement, document.getElementById('root'));` javascript 复制代码