目录
一:前端开发的演变
二:ReactJS简介
三:搭建环境
四:React快速入门
一:前端开发的演变
到目前为止,前端的开发经历了四个阶段,目前处于第四个阶段。这四个阶段分别是:
阶段一:静态页面阶段
- Model(模型层):提供/保存数据
- Controller(控制层):数据处理,实现业务逻辑
- View(视图层):展示数据,提供用户界面
阶段二:ajax阶段
阶段三:前端MVC阶段
阶段四: SPA 阶段
二:ReactJS简介
- Flux
- Redux
- Ant Design of React
三:搭建环境
创建项目
输入命令,进行初始化:
tyarn init -y
在命令输入如下命令:
tyarn add umi --dev #项目中添加umi的依赖
可以看到,相关的依赖已经导入进来了。
编写HelloWorld程序
第一步,在工程的根目录下创建confifig目录,在confifig目录下创建confifig.js文件。
在UmiJS的约定中,confifig/confifig.js将作为UmiJS的全局配置文件。
在umi中,约定的目录结构如下:
在confifig.js文件中输入以下内存,以便后面使用:
//导出一个对象,暂时设置为空对象,后面再填充内容
export default {};
第二步,创建HelloWorld.js页面文件
export default () => {
return <div>hello world</div>;
}
#启动服务
umi dev
添加 umi-plugin-react 插件
#添加插件
tyarn add umi-plugin-react --dev
添加成功:
接下来,在confifig.js文件中引入该插件:
export default {
plugins: [
['umi-plugin-react', {
//暂时不启用任何功能
}]
]
};
构建和部署
umi build
可以看到,已经生成了index.html和umi.js文件。我们打开umi.js文件看看。
四:React快速入门
JSX语法
- 所有的html标签必须是闭合的
- 在JSX语法中,只能有一个根标签,不能有多个
const div1 = <div>hello world</div> //正确
const div2 = <div>hello</div> <div>world</div> //错误
在JSX语法中,如果想要在html标签中插入js脚本,需要通过{}插入js脚本。
组件
在React中,这样定义一个组件:
import React from 'react'; //第一步,导入React
class HelloWorld extends React.Component { //第二步,编写类并且继承 React.Component
render(){ //第三步,重写render()方法,用于渲染页面
return <div>hello world!</div> //JSX语法
}
}
export default HelloWorld; //第四步,导出该类
查看效果:
导入自定义组件
import React from 'react'
import HelloWorld from './HelloWorld' //导入HelloWorld组件
class Show extends React.Component{
render(){
return <HelloWorld/>; //使用HelloWorld组件
}
}
export default Show;
组件参数
import React from 'react'
import HelloWorld from './HelloWorld' //导入HelloWorld组件
class Show extends React.Component{
render(){
return <HelloWorld name="zhangsan">shanghai</HelloWorld>; //使用HelloWorld组件
}
}
export default Show;
import React from 'react'; //第一步,导入React
class HelloWorld extends React.Component { //第二步,编写类并且继承 React.Component
render(){ //第三步,编写render()方法,用于渲染页面
return <div>hello world! name={this.props.name}, address={this.props.children}
</div> //JSX语法
}
}
export default HelloWorld; //第四步,导出该类
组件的状态
import React from 'react'
class List extends React.Component{
constructor(props){ // 构造参数中必须要props参数
super(props); // 调用父类的构造方法
this.state = { // 初始化this.state
dataList : [1,2,3],
maxNum : 3
};
}
render(){
return (
<div>
<ul>
{
// 遍历值
this.state.dataList.map((value,index) => {
return <li key={index}>{value}</li>
})
}
</ul>
<button
onClick={()=>{ //为按钮添加点击事件
let maxNum = this.state.maxNum + 1;
let list = [...this.state.dataList, maxNum];
this.setState({ //更新状态值
dataList : list,
maxNum : maxNum
});
}}>
添加</button>
</div>
);
}
}
export default List;
当点击“添加”按钮:
生命周期
生命周期示例:
import React from 'react'; //第一步,导入React
class LifeCycle extends React.Component {
constructor(props) {
super(props);
//构造方法
console.log("constructor()");
}
componentDidMount() {
//组件挂载后调用
console.log("componentDidMount()");
}
componentWillUnmount() {
//在组件从 DOM 中移除之前立刻被调用。
console.log("componentWillUnmount()");
}
componentDidUpdate() {
//在组件完成更新后立即调用。在初始化时不会被调用。
console.log("componentDidUpdate()");
}
shouldComponentUpdate(nextProps, nextState){
// 每当this.props或this.state有变化,在render方法执行之前,就会调用这个方法。
// 该方法返回一个布尔值,表示是否应该继续执行render方法,即如果返回false,UI 就不会更新,默
认返回true。
// 组件挂载时,render方法的第一次执行,不会调用这个方法。
console.log("shouldComponentUpdate()");
}
render() {
return (
<div>
<h1>React Life Cycle!</h1>
</div>
);
}
}
export default LifeCycle;