前端框架--React(1、基础语法)
什么是React
React 是一个用于构建用户界面的 JavaScript 库,能够帮助你操作DOM呈现页面效果
使用了虚拟DOM和优秀的Diffing语法,减少了与真实DOM的交互
具有组件化的特点,并且在React中组件通常以函数式组件或类式组件存在
技术成熟,社区完善,配件齐全,适用于大型Web项目
安装方式
通过在线cdn ,使用script标签导入
通过安装cli脚手架
npm i -g create-react-app
安装React脚手架工具create-react-app [projectName]
创建基本的React项目npm start
基本语法
jsx
在React中 使用了jsx来代替常规的JavaScript。JSX= Javascript+ xml, 就是Javascript和XML结合的一种格式,是 JavaScript 的语法扩展。它有些像jsp,也是将开发语言混在html当中。
jsx 语法规则:
定义虚拟DOM时,不要写引号
标签中混入js表达式要用{}
样式的类名指定不要用class 要用className
内联样式,要用
style={{key:value}}
的形式去写只有一个根标签 且 标签必须闭合
标签首字母 若小写开头 则转化为html中的同名元素 若大写开头 则被认定是组件
jsx 中的{}中只能写js表达式 如
1
2
3
4
51. a
2. a+b
3. demo(1)
4. arr.map
5. function name() {}
state
1 | import { Component } from 'react' |
注意:
不要直接修改state,如果需要修改state中的值,则使用 setState方法
1
2this.state.text = 'hello' // ×
this.setState({text:'hello'}) // √state的赋值更新可能是异步的,如果你需要依赖它的更新去进行一些操作的话,可以让
setState()
接收一个函数而不是一个对象1
2
3
4
5this.setState(function(state, props) {
return {
text: state.text + props.seb1
};
});state的更新会被合并 如果state包含多个属性,你可以使用 setState() 来单独更新它
页面渲染
React页面渲染的核心就是 Render函数,它会将return的元素渲染到页面上
函数式编程
1 | import ... |
类式编程
1 | import ... |
props参数
组件,从概念上类似于 JavaScript 函数。它接受任意的入参(即 “props”),并返回用于描述页面展示内容的 React 元素。
注意:无论是函数式组件还是类式组件,都不能修改props。
1 | function demo(props) { |
1 | class Welcome extends React.Component { |
循环渲染列表和条件渲染
1 | import ... |
嵌套组件
1 | import ... |
事件处理
内置生命周期事件
React组件的生命周期分为三个状态
- Mounting(挂载):已插入真实DOM 回调函数执行顺序:
- constructor() // 先初始化数据
- render() // 后初始化试图
- componentDidMount() // 回调通知
- Updating(更新):正在被重新渲染,当组件的props或state发生改变时:
- render() // 重新渲染视图
- componentDidUpdate() // 回调通知
- Unmounting(卸载):已移出真实 DOM,卸载组件之前
- componentWillUnmount()
自定义事件
基础语法
1 | import ... |
默认行为
在 React 中不能通过返回 false
的方式阻止默认行为。必须显式的使用 preventDefault。
1 | function Form() { |
this指向
由于ES6的Class内部特性,React组件内部的方法需要绑定this指向。
在整个Class类中,所有的this指向都是Class的实例,但是当回调函数被赋值后,其体内的this指向并不会继承原本this的指向,因为此刻触发该回调函数的并不是Class的实例。所以你需要手动绑定该this指向,否则它将会是undefinded。
解决方案:
箭头函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28import ...
class App extends Component {
constructor() {
super(...arguments)
this.state = {
text: 'this is a HomePageeeeee!!!!!',
}
}
changeText(){
log('this')
}
render() {
let { text } = this.state
return (
<div className='App'>
<header className='App-header'>
<p>{text}</p>
<button onClick={()=>this.changeText}></button>
</header>
</div>
)
}
}
export default App使用bind()函数手动绑定this
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28import ...
class App extends Component {
constructor() {
super(...arguments)
this.state = {
text: 'this is a HomePageeeeee!!!!!',
}
}
changeText(){
log('this')
}
render() {
let { text } = this.state
return (
<div className='App'>
<header className='App-header'>
<p>{text}</p>
<button onClick={this.changeText.bind(this)}></button>
</header>
</div>
)
}
}
export default Apppublic class fields 语法,这种语法需要配置开启,使用
Create React App
命令创建的项目默认开启1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28import ...
class App extends Component {
constructor() {
super(...arguments)
this.state = {
text: 'this is a HomePageeeeee!!!!!',
}
}
changeText = ()=> {
log('this')
}
render() {
let { text } = this.state
return (
<div className='App'>
<header className='App-header'>
<p>{text}</p>
<button onClick={this.changeText}></button>
</header>
</div>
)
}
}
export default App
传递参数
1 | import ... |
1 | import ... |