React组件
组件 可以对局部视图的封装、可复用、维护、独立
从创建方式来分,可以分为两类:
- 函数组件:使用函数创建的组件
- 类组件:使用类创建的组件
函数组件:
规则:
- 为了和普通函数对比 ,首字母必须大写。
- 函数必须要有返回值,返回值为null的情况下,不渲染任何内容
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
//函数组件
function Hello(){
return (<h1>Hello 函数组件</h1>)
}
// 箭头函数写法
// const Hello = ()=>{
// return (<h1>Hello 函数组件</h1>)
// }
// 箭头函数简写
// const Hello = ()=> (<h1>Hello 函数组件</h1>)
//渲染组件
ReactDOM.render(<Hello />,document.querySelector('#root'));

类组件
用ES6的class类创建的组件
规则:
- 类名称首字母必须大写。
- 类组件要继承React.Component
- 类组件必须要提供render方法
- 必须要有返回值,返回值为null的情况下,不渲染任何内容
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 类组件
class Hello extends React.Component {
render() {
return (<h1>Hello 类组件</h1>)
}
}
// 渲染组件
ReactDOM.render(<Hello></Hello>,document.getElementById('root'));

一般来说,我们多个组件如何写,每一个组件对应一个js文件,维护起来比较方便
把组件抽离成单独的js:
在my-app 文件夹下面的src文件夹里面新建一个 Hi.js 文件
Hi.js代码如下:
// 创建Hi组件
import React from 'react'
class Hi extends React.Component {
render() {
return (<h1>Hi, everyone</h1>)
}
}
// 导出Hi组件
export default Hi
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
import Hi from './Hi'
ReactDOM.render(<Hi />, document.getElementById('root'));

事件
命名:on+事件名称(驼峰命名法)
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 事件绑定
class App extends React.Component {
render() {
return (<input type="button" onClick={()=>{console.log('我被点击了')}} value="button" />)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
这样有点混乱,js和HTML 混合在一起,我们可以这样写:
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 事件绑定
//(类中定义一个方法:是原型的方法) handleClick 是原型的方法
class App extends React.Component {
handleClick() {
console.log('我被点击了')
}
render() {
return (<input type="button" onClick={this.handleClick} value="button" />)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
上面我们都是用类组件写的,接下来我们用函数组件写:
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 事件绑定
function App() {
function handleClick() {
console.log('我被点击了')
}
return (<input type="button" onClick={handleClick} value="button" />)
}
ReactDOM.render(<App />, document.getElementById('root'));

事件对象
我们经常在事件处理程序当中需要拿到事件对象,怎么拿事件对象呢?
在react中把这个事件对象叫合成对象,兼容所有浏览器
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 事件绑定
function App() {
function handleClick(e) {
console.log(e);
}
return (<input type="button" onClick={handleClick} value="button" />)
}
ReactDOM.render(<App />, document.getElementById('root'));

做一个超链接,阻止它跳转,点击超链接,不会跳转:
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 事件绑定
function App() {
function handleClick(e) {
// React事件对象也叫合成对象 兼容所有浏览器
e.preventDefault();
console.log("我被阻止了");
}
return (<a onClick={handleClick} href="https://www.baidu.com">链接到百度</a>)
}
ReactDOM.render(<App />, document.getElementById('root'));

React State(状态)
状态的概念
状态就是应用程序当中的数据
开发组件,组件肯定有自己的数据
从状态的角度来分,还可以分成两类:
- 有状态的组件 (类组件当中是有状态的)(一般负责更新UI)
- 无状态的组件 (函数组件中无状态)(一般用于展示静态内容)
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 创建组件
class App extends React.Component {
constructor() {
super()
// 初始化状态
this.state = {
num: 10
}
}
render() {
return (<div>有状态组件 {this.state.num}</div>)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
简写的方式:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 创建组件
class App extends React.Component {
state = {
num: 10
}
render() {
return (<div>有状态组件 {this.state.num}</div>)
}
}
ReactDOM.render(<App />, document.getElementById('root'));

修改状态
react状态修改只能用 setState 来修改状态(数据驱动视图)
计数器功能:
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 创建组件
class App extends React.Component {
state = {
num: 0
}
render() {
return (<div>
有状态组件 {this.state.num}
<button onClick={()=>{
this.setState({
num:this.state.num + 1
})
}}>+1</button>
</div>)
}
}
ReactDOM.render(<App />, document.getElementById('root'));

优化代码:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 创建组件
class App extends React.Component {
state = {
num: 0
}
// 事件处理程序
handleIncrement () {
// 修改state 修改state并更新UI
this.setState({
num: this.state.num + 1
})
}
render() {
return (<div>
有状态组件 {this.state.num}
<button onClick={this.handleIncrement}>+1</button>
</div>)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
!!!这样写就会报错,是因为this的指向问题

解决方法一:bind()
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 创建组件
class App extends React.Component {
state = {
num: 0
}
// 事件处理程序
handleIncrement () {
// 修改state 修改state并更新UI
console.log(this);
this.setState({
num: this.state.num + 1
})
}
render() {
return (<div>
有状态组件 {this.state.num}
<button onClick={this.handleIncrement.bind(this)}>+1</button>
</div>)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
解决方法二:bind放入构造函数中
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 创建组件
class App extends React.Component {
state = {
num: 0
}
constructor() {
super()
this.handleIncrement = this.handleIncrement.bind(this)
}
// 事件处理程序
handleIncrement () {
// 修改state 修改state并更新UI
console.log(this);
this.setState({
num: this.state.num + 1
})
}
render() {
return (<div>
有状态组件 {this.state.num}
<button onClick={this.handleIncrement}>+1</button>
</div>)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
解决方法三:箭头函数解决
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 创建组件
class App extends React.Component {
state = {
num: 0
}
// 事件处理程序
handleIncrement() {
// 修改state 修改state并更新UI
console.log(this);
this.setState({
num: this.state.num + 1
})
}
render() {
return (<div>
有状态组件 {this.state.num}
<button onClick={()=>{this.handleIncrement()}}>+1</button>
</div>)
}
}
ReactDOM.render(<App />, document.getElementById('root'));
解决方法四:(推荐)使用class的实例方法
index.js代码如下:
// 导入相关的包
import React from "react";
import ReactDOM from "react-dom";
// 创建组件
class App extends React.Component {
state = {
num: 0
}
// 事件处理程序
handleIncrement = () => {
// 修改state 修改state并更新UI
console.log(this);
this.setState({
num: this.state.num + 1
})
}
render() {
return (<div>
有状态组件 {this.state.num}
<button onClick={this.handleIncrement}>+1</button>
</div>)
}
}
ReactDOM.render(<App />, document.getElementById('root'));

版权声明:本文为pangqixjj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。