【React 入门系列 03】React 组件

简介: 组件是React的一等公民,使用React组件,组件表示页面中的部分功能,多个组件的组合实现了整个完整的页面功能。组件可复用,独立,可组合。React中的组件类型被分为了两类:函数组件,又被称为无状态组件;类组件,又被称为有状态组件。状态(state)即数据。函数组件没有自己的状态,自负责数据展示。类组件有自己的状态,负责更新UI。React中想要实现该功能,就要使用类组件(有状态组件)。有状态组件通过 state()和setState()两个方法可以实现对状态(数据)的获取和修改。

React 组件:

组件是React的一等公民,使用React组件,组件表示页面中的部分功能,多个组件的组合实现了整个完整的页面功能。

组件可复用,独立,可组合。

1.React 组件创建:

1.1 使用函数创建组件:

函数组件:使用JS的函数(或箭头函数)创建的组件

// 导入React:importReactfrom"react";
importReactDOMfrom"react-dom"// 函数组件:functionTitle(){
return (
<div>你好!世界!!!</div>  )
}

渲染函数组件:用函数名作为组件标签名,组件可以使用单标签也可以使用双标签。

// 渲染:ReactDOM.render(<Title/>, document.getElementById("root"))

1.2 使用类创建组件:

类组件:使用ES6class创建的组件。

1.3 抽离组件为单独的JS文件:

2.React 事件处理:

2.1 事件绑定:

React事件绑定语法与DOM事件语法相似。语法是on事件命(首字母大写)就是事件处理程序,React事件采用驼峰命名法。

// 定义一个函数组件:functionFuncComponent() {
// 点击事件回调函数:functionhandler() {
alert("触发点击事件!")
    }
// 返回JSX:return (
// 事件绑定:<buttononClick={handler}>Click Me</button>    )
}
/** * 定义一个类型组件 */classClassComponentextendsReact.Component{
// 点击事件回调函数:handler() {
alert("触发点击事件!")
    }
// 类组件中需要声明一个render函数,函数返回值是一个JSX:render() {
// 返回JSX:return (
// 事件绑定:<buttononClick={this.handler}>Click Me</button>        )
    }
}

2.2 事件对象:

可以通过事件处理函数的参数获取到事件对象,React中的事件对象叫做:合成事件(对象)。合成事件兼容所有的浏览器,无需担心跨浏览器兼容性问题。

// 点击事件回调函数:handler(event) {
console.log(event)
}

在事件回调函数入参处声明一个event参数,这个参数接受合成事件对象。可以通过合成事件对象阻止浏览器默认行为:

event.preventDefault()

3.状态组件:

React中的组件类型被分为了两类:函数组件,又被称为无状态组件;类组件,又被称为有状态组件。状态(state)即数据。

函数组件没有自己的状态,自负责数据展示。类组件有自己的状态,负责更新UIReact中想要实现该功能,就要使用类组件(有状态组件)。

有状态组件通过 state()setState()两个方法可以实现对状态(数据)的获取和修改。

3.1 state 方法:

状态(state)即数据,是组件内部的私有数据,只能在组件内部使用。state的值类型是对象数据类型,表示一个组件中可以有多个数据。

// 设置类组件中的数据(状态):state= {
count : 1}

JSX中使用类组件中的state属性值:

<div>{this.state.count}</div>

3.2 setState 方法:

类组件中的state属性是可以改变的,通过类组件中提供的setState()方法进行修改:

// 点击事件回调函数:handler= ()=> {
this.setState({
count: this.state.count+1    })
}

setState()方法参数传入的是一个state对象。注意:不要直接修改state中的值。setState()方法体现了React的数据驱动视图特性,在satet中修改的数据会实时更新到UI页面中。

实现一个简单的计数器功能,点击按钮之后,计数加一

// 导入React:importReactfrom"react";
importReactDOMfrom"react-dom"// 类组件:classAPPextendsReact.Component{
constructor(props) {
super(props);
// 初始化statethis.state= {
count: 0    }
  }
// 返回渲染组件:render(){
return (
<div><h1>计算器:{this.state.count}</h1><buttononClick={() => {
this.setState({
count: this.state.count+1      })
    }}>点击加一</button></div>    )
  }
}
// 渲染:ReactDOM.render(<APP/>, document.getElementById("root"))

3.3 JSX 抽离事件回调函数:

JSX中掺杂过多的的JS逻辑代码会显得十分混乱。可以将JavaScript逻辑抽离到单独的方法中,保证JSX结构的清晰。

4.事件绑定 this 指向:

需要指定this指向,否则可能导致如下问题:

这个问题就是由于this指向问题导致的,普通函数中没有this指向,所以this指向为undefined,所以这里会报错没有找到属性,因此需要指定this指向。

4.1 箭头函数:

利用箭头函数自身不绑定this的特点,箭头函数本身是没有this指向的,他会一直向外查找并复用外层结构的this指向。

还可以使用事件回调箭头函数中调用普通函数:

4.2 Function.prototype.bind():

利用ES6bind方法,将事件处理程序中的this与组件实例绑定到一起。

// 导入React:importReactfrom"react";
importReactDOMfrom"react-dom"// 类组件:classAPPextendsReact.Component{
constructor(props) {
super(props);
// 初始化statethis.state= {
count: 0    }
// 绑定this:this.add=this.add.bind(this)
  }
add(){
this.setState({
count: this.state.count+1    })
  }
// 返回渲染组件:render(){
return (
<div><h1>计算器:{this.state.count}</h1><buttononClick={this.add}>点击加一</button></div>    )
  }
}
// 渲染:ReactDOM.render(<APP/>, document.getElementById("root"))

4.3 类组件箭头函数:

使用类组件中定义的箭头函数(实例方法)作为事件回调函数。

// 点击事件回调函数:handler= () => {
this.setState({
count: this.state.count+1    })
}
// 类组件中需要声明一个render函数,函数返回值是一个JSX:render() {
// 返回JSX:return (
<div><div>{this.state.count}</div>            {/*使用箭头函数作为事件的*/}
<buttononClick={this.handler}>Click Me</button></div>    )
}

5.组件表单处理:

5.1 受控组件:

5.2 非受控组件:

借助ref,使用原生DOM方式来获取表单元素值。ref 的作用获取DOM或者组件。

// 导入React:importReactfrom"react";
importReactDOMfrom"react-dom"// 类组件:classAPPextendsReact.Component {
constructor() {
super()
// 创建ref:this.txtRef=React.createRef()
    }
// 获取文本框的值:getText= () => {
console.log("文本框中的值:", this.txtRef.current.value);
    }
render() {
return (
<div><inputtype="text"ref={this.txtRef}/><buttononClick={this.getText}>获取文本框中的值</button></div>        )
    }
}
// 渲染:ReactDOM.render(<APP/>, document.getElementById("root"))// 导入React:importReactfrom"react";
importReactDOMfrom"react-dom"// 类组件:classAPPextendsReact.Component {
constructor() {
super()
// 创建ref:this.txtRef=React.createRef()
    }
// 获取文本框的值:getText= () => {
console.log("文本框中的值:", this.txtRef.current.value);
    }
render() {
return (
<div><inputtype="text"ref={this.txtRef}/><buttononClick={this.getText}>获取文本框中的值</button></div>        )
    }
}
// 渲染:ReactDOM.render(<APP/>, document.getElementById("root"))


相关文章
|
1月前
|
前端开发 JavaScript 定位技术
React 地图组件 Mapbox 入门指南
Mapbox 是一个强大的地图平台,提供丰富的地图数据和工具,支持多种开发语言和框架。本文介绍如何在 React 项目中使用 Mapbox,涵盖基础概念、安装配置、基本用法、常见问题及解决方法、高级用法等内容,并通过代码示例详细说明,帮助开发者提升地图应用的开发效率和用户体验。
81 2
|
1月前
|
前端开发 API UED
React 图片轮播 Carousel:从入门到进阶
本文介绍了在 React 中实现图片轮播(Carousel)的方法,从基础安装和配置 `react-slick` 开始,逐步讲解了常见问题如图片路径、性能优化、自定义样式和交互处理,以及高级话题如动态数据加载和响应式设计。通过详细示例,帮助开发者避免易错点,提升轮播图的用户体验。
34 3
|
1月前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
87 10
|
2月前
|
前端开发 JavaScript 开发者
探索现代Web前端技术:React框架入门
【10月更文挑战第9天】 探索现代Web前端技术:React框架入门
|
3月前
|
移动开发 前端开发 JavaScript
构建高效跨平台移动应用:React Native入门指南
【8月更文挑战第47天】在移动开发领域,React Native凭借其跨平台特性和高效的开发模式赢得了开发者的青睐。本文将通过一个简易的待办事项应用实例,带领读者快速入门React Native,并展示如何利用JavaScript和React框架构建具有原生性能的应用。我们将探讨环境配置、界面布局、状态管理和数据流,以及如何打包和发布您的应用。准备好,让我们开始React Native之旅!
77 20
|
3月前
|
前端开发 JavaScript
React技术栈-React UI之ant-design使用入门
关于React技术栈中使用ant-design库的入门教程,包括了创建React应用、搭建开发环境、配置按需加载、编写和运行代码的步骤,以及遇到错误的解决方法。
48 2
React技术栈-React UI之ant-design使用入门
|
3月前
|
XML 存储 前端开发
React 基础入门
【9月更文挑战第1天】本文详细介绍了由Facebook开发的JavaScript库React,涵盖环境搭建、基本概念、常见问题及解决方案。首先,通过安装Node.js、npm和Create React App快速搭建开发环境;接着,讲解了JSX、组件(包括函数和类组件)、state和props等核心概念;最后,针对JSX语法错误、state异步更新及props与state混淆等问题提供了具体的解决方法和示例代码,帮助读者更好地理解和应用React。
42 2
|
4月前
|
移动开发 前端开发 JavaScript
构建高效跨平台移动应用:React Native入门指南
【8月更文挑战第31天】 在移动开发领域,React Native凭借其跨平台特性和高效的开发模式赢得了开发者的青睐。本文将通过一个简易的待办事项应用实例,带领读者快速入门React Native,并展示如何利用JavaScript和React框架构建具有原生性能的应用。我们将探讨环境配置、界面布局、状态管理和数据流,以及如何打包和发布您的应用。准备好,让我们开始React Native之旅!
|
4月前
|
开发者
告别繁琐代码,JSF标签库带你走进高效开发的新时代!
【8月更文挑战第31天】JSF(JavaServer Faces)标准标签库为页面开发提供了大量组件标签,如`&lt;h:inputText&gt;`、`&lt;h:dataTable&gt;`等,简化代码、提升效率并确保稳定性。本文通过示例展示如何使用这些标签实现常见功能,如创建登录表单和展示数据列表,帮助开发者更高效地进行Web应用开发。
48 0
|
4月前
|
前端开发 JavaScript UED
🎬JSF 与 Ajax:打造瞬间响应的魔法界面!🚀 用户输入即刻,数据交互如梦幻泡影般呈现!
【8月更文挑战第31天】在现代Web应用中,异步数据交互是提升用户体验的关键。JavaServer Faces (JSF) 作为标准Java Web框架,结合Ajax技术,可轻松实现页面异步更新与数据交互。本文通过示例代码介绍如何在JSF中使用Ajax组件(如`f:ajax`)及后端处理方法实现异步功能,并结合JavaScript处理复杂交互,帮助开发者提升Web应用体验。
46 0