赞
踩
目录
4.2. Function.prototype.bind()
- function Hello(){
- return {
- <div> 函数组件 </div>
- }
- }
注意:
- 函数名称必须以大写字母开头。
- 函数组件必须有返回值,表示该组件的结构。
- 如果返回值为null,表示不渲染任何内容。
- const Hello = () => <div> 函数组件 </div>
-
- // 渲染
- ReactDOM.render(<Hello />,document.getElementById('root'))
- class Hello extends React.Component {
- render(){
- return <div> 类组件 </div>
- }
- }
- ReactDOM.render(<Hello />,document.getElementById('root'))
注意:
- 类名称也必须以大写字母开头。
- 类组件应该继承 React.Component 父类,从而可以使用父类中提供的方法或属性。
- 类组件必须提供 render() 方法。
- render() 方法必须有返回值,表示该组件的结构。
思考:项目中组件多了之后,我们该如何组织这些组件呢?
- 选项一:将所有组件放在同一个JS文件中
- 选项二:将每个组件放到单独的JS文件中(✔)
- // Hello.js
- import React from 'react'
- class Hello extends React.Component {
- render() {
- return <div> 组件 </div>
- }
- }
- // 导出 Hello 组件
- export default Hello
-
- // index.js
- import Hello from './Hello'
- // 渲染导入的 Hello组件
- ReactDOM.render(<Hello />,root)
- .// 类组件
- class App extends React.Component {
- handleClick() {
- console.log('单击事件')
- }
- render() {
- return {
- <button onclick={this.handleClick} ><button>
- }
- }
- }
-
- // 函数组件
- fucntion App() {
- function handleClick() {
- console.log('点击事件')
- }
- return {
- <button onclick={handleClick} ><button>
- }
- }
- function handleClick(e) {
- // 阻止浏览器的默认行为
- e.preventDefault ()
- console.log('事件对象',e)
- }
- <a href="www.baidu.com" onClick={handleClick}>点击</a>
比如计数器案例中,点击按钮让数值加1。0 和 1 就是不同时刻的状态,而由0 变 1 就表示状态发生了变化。状态变化后,UI也要相应的更新。React 中想要实现该功能,就要使用有状态组件来实现。
- class App extends React.Component {
- constructor() {
- super()
- // 初始化 state
- this.state = {
- count: 0
- }
- }
- // ES6 简化语法 初始化state
- state = {
- count : 0
- }
- render() {
- return {
- <div> 计数器 </div>
- }
- }
- }
-
- ReactDOM.render(<App />,document.getElementById('root'))
初始化完成后,接下来就需要考虑在组件结构中如何使用state:
- render() {
- return {
- <div> 计数器 { this.state }</div>
- }
- }
- class App extends React.Component {
- state = {
- count : 0
- }
- render() {
- return {
- <div> 计数器 { this.state.count }</div>
- <button onClick={() => {
- // 正确
- this.setState({
- count: this.state.count + 1
- })
-
- // 错误
- this.state.count +1
- }}>+1</button>
- }
- }
- }
-
- ReactDOM.render(<App />,document.getElementById('root'))
- class App extends React.Component {
- state = {
- count : 0
- }
-
- // 事件处理程序
- OnIncreaseNumb() {
- this.setState({
- count: this.state.count + 1
- })
- }
- render() {
- return {
- <div> 计数器 { this.state.count }</div>
- <button onClick={this.OnIncreaseNumb}>+1</button>
- }
- }
- }
-
- ReactDOM.render(<App />,document.getElementById('root'))
此时,会发现页面报错:
class App extends React.Component { state = { count : 0 } OnIncreaseNumb() { this.setState({ count: this.state.count + 1 }) } render() { return { <div> 计数器 { this.state.count }</div> <button onClick={this.OnIncreaseNumb}>+1</button> } } } ReactDOM.render(<App />,document.getElementById('root'))原因:事件处理程序中 this 的值为 undefined 。
解决方案:this指向组件实例(render方法中的this即是组件实例)
根据上述提出的问题以及解决方案,事件绑定this指向有以下三种方式:
- class App extends React.Component {
- state = {
- count : 0
- }
-
- OnIncreaseNumb() {
- this.setState({
- count: this.state.count + 1
- })
- }
- render() {
- return {
- <div> 计数器 { this.state.count }</div>
- // 箭头函数中 this 指向外部环境 此处为:render方法
- <button onClick={ () => this.OnIncreaseNumb()}>+1</button>
- }
- }
- }
-
- ReactDOM.render(<App />,document.getElementById('root'))
- class App extends React.Component {
- constructor() {
- state = {
- count : 0
- }
- super()
- this.OnIncreaseNumb = this.OnIncreaseNumb.bind(this)
- }
- OnIncreaseNumb() {
- this.setState({
- count: this.state.count + 1
- })
- }
- render() {
- return {
- <div> 计数器 { this.state.count }</div>
- <button onClick={ this.OnIncreaseNumb }>+1</button>
- }
- }
- }
-
- ReactDOM.render(<App />,document.getElementById('root'))
- class App extends React.Component {
- state = {
- count : 0
- }
-
- OnIncreaseNumb = () => {
- this.setState({
- count: this.state.count + 1
- })
- }
- render() {
- return {
- <div> 计数器 { this.state.count }</div>
- <button onClick={ this.OnIncreaseNumb }>+1</button>
- }
- }
- }
-
- ReactDOM.render(<App />,document.getElementById('root'))
<input type="text" value={this.state.txt} />
所以,受控组件其实就是:其值受到React 控制的表单元素。
- class App extends React.Component {
- state = {
- txt: ''
- }
-
- handleChange = e => {
- this.setState({
- txt: e.target.value
- })
- }
- render() {
- return {
- <div>
- <input type="text" value={this.state.txt} onChange={this.handleChange} />
- </div>
- }
- }
- }
-
- ReactDOM.render(<App />,document.getElementById('root'))
优化步骤:
- class App extends React.Component {
- state = {
- txt: '',
- content: '',
- city: 'sd',
- isChecked: false
- }
-
- handleChange = e => {
- // 获取当前DOM对象
- const target = e.target
-
- // 根据类型获取对应值
- const value = target.type === 'ckeckbox'
- ? target.checked
- : target.value
-
- // 根据name 设置对应state
- const name = target.name
- this.setState({
- [name]: value
- })
- }
- render() {
- return {
- <div>
- <input type="text" name="txt" value={this.state.txt} onChange={this.handleChange} />
- <textarea name="content" value={this.state.content} onChange={this.handleContent}></textarea>
- <select name="city" value={this.state.city} onChange={this.handleCity}>
- <option value="sd">山东</option>
- <option value="hb">河北</option>
- <option value="tj">天津</option>
- </select>
- <br/>
- <input name="checkex" type="checkbox" checked={this.state.isChecked} onChange={this.handleChecked}>
- </div>
- }
- }
- }
-
- ReactDOM.render(<App />,document.getElementById('root'))
使用步骤:
- constructor() {
- super()
- this.txtRef = React.createRef()
- }
<input type="txt" ref={this.txtRef} />
console.log(this.txtRef.current.value)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。