2、React模块与组件
模块与组件的理解
- 模块
- 向外提供特定功能的js 程序, 一般就是一个js 文件
- 复用js, 简化js 的编写, 提高js 运行效率
- 组件
- 用来实现特定(局部)功能效果的代码集合(html/css/js)
- 复用编码, 简化项目编码, 提高运行效率
组件的基本使用
创建组件有两种方式
工厂函数组件
简单组件,通过函数返回值即可。函数名就是组件(标签)名。
1
2
3
4function MyComponent() {
return <h2>工厂函数组件(简单组件)</h2>
}
ReactDOM.render(<MyComponent />, document.getElementById('test'))ES6类组件
复杂组件,通过ES6类中的render方法。
1
2
3
4
5
6class MyComponent2 extends React.Component {
render() {
return <h2>ES6类组件(复杂组件)</h2>
}
}
ReactDOM.render(<MyComponent2 />, document.getElementById('test2'))
组件三大属性
state
state用于记录属性,其声明在constructor
中,值是一个对象。(简单组件中没有状态)
1 | constructor(props) { |
在render
中可以通过this.state.xxx
获取相关属性的值。此时的this指向当前对象。
1 | render() { |
为h2
标签绑定事件只需要在类中新增方法即可,但其默认this
并不是指向当前对象,而是undefiend
因此,需要在constructor
将其指向当前对象。
1 | class Like extends React.Component { |
props
基本用法
1 | function Person(props) { |
属性传入时也可以使用扩展运算符
1 | ReactDOM.render(<Person {...p1} />, document.getElementById('test')) |
通过ES6类的继承实现语法
1 | class Test extends React.Component { |
默认值
1
2
3
4Person.defaultProps = {
sex: '男',
age: 18
}设置属性的类型
需要引入
react-type
文件1
2
3
4
5// 指定属性类型和必要性
Person.propTypes = {
name: PropTypes.string.isRequired,
age: PropTypes.number
}
refs和事件处理
为元素绑定
ref
1
<input type="text" ref='content' />
事件中通过
this.refs.content
即可拿到当前DOM元素1
2
3
4showInput() {
const input = this.refs.content
alert(input.value)
}
官方推荐的写法并不是使用字符串,而是使用一个函数,将其挂载到React对象中。
1 | <input type="text" ref={input => this.input = input} |
此时通过this.input.value
即可拿到值。
组件组合使用
DEMO涉及到三个组件与组件之间的传值。其原则如下
- 都需要使用到的数据则放在父组件中
- 状态定义在哪个组件,则哪个组件修改状态
- 父组件将修改状态的函数作为
props
属性传递给子组件
1 | class App extends React.Component { |
List组件渲染
1 | class List extends React.Component { |
表单
收集表单数组有两种方式
受控组件
表单项输入数据能自动收集成状态
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
26class LoginForm extends React.Component {
constructor(props) {
super(props)
this.state = {
pwd: ''
}
this.handleSubmit = this.handleSubmit.bind(this)
this.handleChange = this.handleChange.bind(this)
}
handleSubmit(e) {
const { pwd } = this.state
e.preventDefault()
}
handleChange(e) {
const pwd = e.target.value
this.setState({ pwd })
}
render() {
return (
<form action='/test' onSubmit={this.handleSubmit}>
密码:<input type="password" value={this.state.pwd} onChange={this.handleChange} />
<input type="submit" value="登录" />
</form>
)
}
}非受控组件
需要时才手动读取表单输入框中的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class LoginForm extends React.Component {
constructor(props) {
super(props)
this.handleSubmit = this.handleSubmit.bind(this)
}
handleSubmit(e) {
const name = this.NameInput.value
e.preventDefault()
}
render() {
return (
<form action='/test' onSubmit={this.handleSubmit}>
用户名:<input type="text" ref={input => this.NameInput = input} />
<input type="submit" value="登录" />
</form>
)
}
}
生命周期
1 | class Life extends React.Component { |
组件的三个生命周期状态
Mount
插入真实DOMUpdate
被重新渲染Unmount
被移出真实DOM
生命周期流程
重要的钩子
render()
初始化渲染或更新渲染调用
componentDidMount()
开启监听, 发送ajax 请求
componentWillUnmount()
做一些收尾工作, 如: 清理定时器
componentWillReceiveProps()
后面需要时讲
虚拟DOM和DOM diff算法
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小康博客!
评论
TwikooWaline