❤React-React 组件基础(类组件)

❤React-React 组件基础

1、组件化开发介绍

组件化开发思想:分而治之

React的组件按照不同的方式可以分成类组件:

划分方式一(按照组件的定义方式)

函数组件(Functional Component )和类组件(Class Component);

划分方式二(按照据组件内部是否有状态需要维护)

无状态组件(Stateless Component )和有状态组件(Stateful Component)

划分方式三(按照据组件的不同职责)

展示型组件(Presentational Component)和容器型组件(Container Component)

函数式组件是官方推荐的,也是接下来我们主要应该学的重点

异步组件-高阶组件

组件包含: React 组件介绍 React 组件的两种创建方式 React 事件处理有状态组件和无状态组件组件中的 state 和 setState()事件绑定 this 指向表单处理

组件特点 可复用、独立、可组合

2、组件化创建的两种方式

(1)函数创建组件---无状态组件 使用JS函数(或者箭头函数)创建的组件 名称以大写字母开头 函数必须有返回值,表示该组件的结构 渲染函数组件:用函数名作为组件标签名 可以是单标签或者双标签

(2)class创建组件---有状态组件

类组件:使用 ES6 的 class 创建的组件
  • 约定1:类名称也必须以大写字母开头
  • 约定2:类组件应该继承 React.Component 父类,从而可以使用父类中提供的方法或属性
  • 约定3:类组件必须提供render0) 方法
  • 约定4:render0)方法必须有返回值,表示该组件的结构

简单编写一个我们的类组件如下

复制代码
js

 代码解读
复制代码import React from 'react'

class Header extends React.Component {
  render() {
    return (
      <div>header</div>
    )
  }
}

class Content extends React.Component {
  render() {
    return (
      <div>content</div>
    )
  }
}

export default class App extends React.Component {
  render() {
    // return (
    //   createElement(
    //     Fragment,
    //     null,
    //     createElement(
    //       Header
    //     ),
    //     createElement(
    //       Content
    //     )
    //   )
    // )
    return (
      <>
        <Header></Header>
        <Content></Content>
      </>
    )
  }
}

(3) 抽离为JS文件 将我们之前的部分进行抽离出来

复制代码
js

 代码解读
复制代码import React from 'react'
class Header extends React.Component {
    render() {
      return (
        <div>header</div>
      )
    }
  }
export default Header;

导入和渲染使用即可

复制代码
js

 代码解读
复制代码import Header from "./header";
<Header></Header>

3、组件事件处理

1 事件绑定

React 事件绑定语法与 DOM 事件语法相似 语法:on+事件名称={事件处理程序},比如:onClick={0)=>{}注意:React 事件采用驼峰命名法,比如:onMouseEnter、onFocus 在函数组件中绑定事件

类组件的方式写法:
函数式组件的方式写法

2事件对象

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

写法如下:

3 有状态组件(类组件)和无状态组件(函数组件)

4 组件的state和setState

5 组件state

6 setState修改状态

7 从JSX之中抽离逻辑代码

事件绑定this指向的转换(三种)

(1) 箭头函数

箭头函数自身不绑定this

(2) Function.prototype.bind()

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

(3) class的事例方法

8 表单绑定

受控组件

demo (输入框、文本框、富文本框、下拉框)

复制代码
javascript

 代码解读
复制代码
import React from 'react';
class Hrllo extends React.Component{
    state = {
        count:0,
        txt:'11',
        textarea:'富文本框',
        city:'bg',
        ischecked:false,

    }
    handleTxtx=e=>{
        console.log('你刚刚点击了'+e.target);
        this.setState({
            txt:e.target.value,
        }) 
        console.log(this.state.txt)
    }
    handleTextarea=e=>{
        console.log('你刚刚点击了'+e.target);
        this.setState({
            textarea:e.target.value,
        }) 
        console.log(this.state.textarea)
    }
    handleCity=e=>{
        console.log('你刚刚点击了'+e.target);
        this.setState({
            city:e.target.value,
        }) 
        console.log(this.state.city)
    }
    handleChecked=e=>{
        console.log('你刚刚点击了'+e.target);
        this.setState({
            ischecked:e.target.checked,
        }) 
        console.log(this.state.ischecked)
    }
    render() {
        return (
            <div>
                {/* 输入框 */}
                <div>
                    <input value={this.state.txt} name="txt" 
                    onChange={this.handleTxtx}></input>
                </div>
                {/* 复选框 */}
                <div>
                    <textarea value={this.state.textarea} 
                    onChange={this.handleTextarea}></textarea>
                </div>
                {/* 单选框 */}
                <select value={this.state.city} onChange={this.handleCity}>
                    <option value="sh">上海</option>
                    <option value="bj">北京</option>
                    <option value="cd">成都</option>
                </select>
                {/* 复选框 */}
                <input type="checkbox" checked={this.state.ischecked} onChange={this.handleChecked}>


                </input>
            </div> 
            )
    }
}
export default Hrllo

受控组件的优化

复制代码
javascript

 代码解读
复制代码
import React from 'react';
class Hrllo extends React.Component{
    state = {
        count:0,
        txt:'11',
        textarea:'富文本框',
        city:'bg',
        ischecked:false,

    }
    handleChange=e=>{
        const target=e.target;
        const value=target.type === 'checkbox'
        ?target.checked
        :target.value;

        const name=target.name;

        console.log('你刚刚点击了'+e.target);
        this.setState({
           [name]:value,
        }) 
        console.log(this.state)
    }
    
    render() {
        return (
            <div>
                {/* 输入框 */}
                <div>
                    <input value={this.state.txt} name="txt" 
                    onChange={this.handleChange}></input>
                </div>
                {/* 复选框 */}
                <div>
                    <textarea value={this.state.textarea} name="textarea" 
                    onChange={this.handleChange}></textarea>
                </div>
                {/* 单选框 */}
                <select value={this.state.city} onChange={this.handleChange} name="city" >
                    <option value="sh">上海</option>
                    <option value="bj">北京</option>
                    <option value="cd">成都</option>
                </select>
                {/* 复选框 */}
                <input type="checkbox" checked={this.state.ischecked} name="ischecked" 
                onChange={this.handleChange}>


                </input>
            </div> 
            )
    }
}
export default Hrllo

非受控组件(DOM方式)

复制代码
javascript

 代码解读
复制代码
// 非受控组件
import React from 'react';
class Hrllo extends React.Component{
    constructor(){
        super()
        this.txtref=React.createRef(); 
    }
   getTxt=()=>{
    console.log('文本框架的值'+this.txtref.current.value);
   }
    render() {
        return (
            <div>
                {/* 输入框 */}
                <input type="text" ref={this.txtref}/>
                <button onClick={this.getTxt}>获取文本框的值</button>
            </div> 
            )
    }
}
export default Hrllo

9 组件部分小案例:

评论列表:

报错:非大写字母开头

把大些字母改成小写字母就可以正常使用啦!

相关推荐
To_OC4 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
To_OC4 小时前
LC 17 电话号码的字母组合:我的回溯算法,就是从这道题开窍的
javascript·算法·leetcode
vipbic4 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy4 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志5 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble6 小时前
c端系统,其实更像一个信息展示平台
前端
你怎么知道我是队长6 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
李姆斯7 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜7 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司7 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能