React(一) —— 组件的创建与state

简介: React(一) —— 组件的创建与state

⛳React入门到精通

🎀组件的创建

类组件

类组件是指使用ES6中class定义的组件称为类组件

导入类组件时 组件名首字母必须大写

类组件必须要继承React.Component父类(相关方法和属性均会被继承)

render为固定函数(必须有),有返回值,返回类组件的结构(jsx)

🏸定义类组件并暴露

import React from 'react'
//App为类名 可随意起 继承 React.Component(固定,不可丢掉)
class App extends React.Component{
render(){
  render(){
    //1.return若要回车必须加上()
    //2.最外层只能有一个标签,不能有兄弟并列
    return (
        <section>
            hello react
            <ul>
                <li>1111</li>
                <li>222</li>
            </ul>
            <div>新的内容111</div>
            <div>新的内容2222</div>
        </section>
    )
}
}
}
export default App       //导出:方便被其他组件引用

🏸在src下的 index.js入口文件中导入 需要的App类组件

React 17之前版本
import React from 'react'
import ReactDOM from 'react-dom'
import App from "./01-base/01-class组件"  //引入时必须大写
ReactDOM.render(<App></App>,document.getElementById("root"))
......................................
React 18版本
import {createRoot} from 'react-dom/client'
import App from "./01-base/01-class组件"    //导入App组件
const container = document.getElementById('root')
const root = createRoot(container);        //App放入的位置
root.render(<App/>)         //单双标签均可以
函数式组件
function App(){
    return (
        <div>
            hello functional component
            <div>111</div>
            <div>2222</div>
        </div>
    )
}
export default App
组件的嵌套
import React, { Component } from 'react'
class Child extends Component{
    render(){
        return <div>child</div>
    }
}
class Navbar extends Component{
    render(){
        return (
            <div>
                navbr
                <Child></Child>
            </div>
        )
    }
}
function Swiper(){
    return <div>swiper</div>
}
const Tabbar = ()=> <div>tabbar</div>
//以上3种子组件的形式 均可进行嵌套
export default class App extends Component {
  render() {
    return (
      <div>
        <Navbar></Navbar>
        <Swiper></Swiper>
        <Tabbar></Tabbar>
      </div>
    )
  }
}
........................................
import App from "./01-base/03-组件的嵌套"
import {createRoot} from 'react-dom/client'
const container = document.getElementById('root')
const root = createRoot(container);
root.render(<App/>)

🩰组件的样式

推荐使用行内样式,因为React觉得每个组件都是一个独立的整体

行内样式

想给虚拟dom添加行内样式,需要使用表达式传入样式对象的方式来实现

  render() {
    var myname = 'xiaoming'
    var isChecked = false
    var obj = {
        backgroundColor:"yellow",
        fontSize:""//驼峰命名法
    }
    return (
      <div>
        {myname}-{10+20}-岁
        {10>20?"a":"b"}
        <div style={obj}>111</div>
    <div style={style={{textDecoration:isChecked?"line-through":''}}>
    //这里有两个括号,第一个表示我们再要JSX里插入了JS了,第二个是对象的括号
        <div style={{background:"red"}}>222</div>
      </div>
    )
  }

🔎1. {}里面为js表达式,不支持语句

🔎2. 行内样式需要写入一个样式对象如上面的obj,这个样式对象的位置可以放在很多地方,例如render函数里、组件原型上、外链js文件中

class样式
  • css文件中写入样式
  • 导入css文件
  • 为元素添加class类名(class需要写成className,在写类js代码,会受到js规则的存在,而class为关键字
 <div className="active">333</div>
 <div id="myapp">444</div> 

⭐️⭐️ ⭐️ class ==> className,for ===> htmlFor(label) ⭐️⭐️ ⭐️

<label htmlFor='username'>用户名:</label>
<input type="text" id="username"></input>

👕事件处理

事件绑定

📢render内使用箭头函数— 直接使用this

a = 100
render(){
    return(
        <button onClick={ ()=>{
            console.log("click1","如果处理逻辑过多不推荐",this.a);
    } }>add1</button>
    )
}

箭头函数作用域为App,所以this直接为App

📢render内调用函数,函数普通函数 – 使用bind改变this指向

a = 100
render(){
    return(
         {/* call,apply改变this指向并自动执行函数;bind改变this指向不自动执行 */}
        <button onClick={ this.handleClick2.bind(this)}>add2-不推荐</button>
    )
}
handleClick2(){
    console.log("click2",this.a)
}

render内刚开始 this 为 undefined,通过使用 bind 将this指向改为App

📢render内调用函数,函数箭头函数 – 直接使用this

a = 100
render(){
    return(
          <button onClick={ this.handleClick3 }>add3-比较推荐</button>
    )
}
handleClick3 = ()=>{
    console.log("click3",this.a)
}

📢render内使用箭头函数调用函数 – 直接使用this

a = 100
render(){
    return(
        {/* 非常推荐 */}
        <button onClick={ ()=>{
            this.handleClick4()  
        } }>add4</button>
        {/* 执行匿名函数后调用handleClick4 */}
    )
}
handleClick4 = ()=>{
    console.log("click4",this.a)
}

onClick里面的this为App,所以当handleClick被调用时不论是箭头函数还是普通函数this均和调用者相同都为App

事件的参数传递

🎐1. 在render里调用方法的地方外面包一层箭头函数

🎐2. 在render里通过this.handleClick.bind(this,参数)来传递

🎐3. 通过event传递

👚ref的应用

📌给标签设置ref=“mytext”

<input ref="mytext"></input>
<button onClick={ ()=>{
   console.log("click1",this.refs.mytext.value);
} }>add1</button>

通过 this.refs.mytext,ref可以获取到应用的真实dom

📌 给组件设置ref="username

通过这个获取 this.refs.username ,ref可以获取到组件对象

📌新的写法(严格模式下)

myref = React.createRef()
<input ref={this.myref}></input>
<button onClick={ ()=>{
   console.log("click",this.myref.current.value);
} }>add1</button>

访问 this.myref.current

🎯状态(state)

状态就是组件描述某种显示情况的数据,由组件自己设置和更改,也就是说组件自己维护,使用状态的目的就是为了在不同的状态下是组建的显示不同(自己管理)

定义state
state={
    mytext:"收藏",
    myShow:true
}
render(){
    return(
        <div>
        <h1>welcome</h1>
        <button onClick={()=>{
           //this.state.mytext = "取消收藏" 不用直接修改state
        }}>{this.state.mytext}</button>
      </div>
    )
}

this.state是纯js对象,在vue中,data属性利用Object.defineProperty处理过的,更改data的数据的时候回出发数据的getter和setter,但是React中没有这样的处理,如果直接更改,react无法得知,所以需要使用setState间接修改

setState

myShow存放在实例的state对象当中,组件的render函数内,会根据组件的state的中的myShow不同 显示“取消”或“收藏”

可以一次更新多个状态

import React, { Component } from 'react'
export default class App extends Component {
  // state={
  //   mytext:"收藏",
  //   myShow:true
  // }
  constructor(){
    super()//必须写
    this.state={
      mytext:"收藏",
      myShow:true,
      myName:"xiaoming"
    }
  }
  //  !!!!以上两种state写法均可以!!!
  render() {
    return (
      <div>
        <h1>welcome--我的名字是{this.state.myName}</h1>
        <button onClick={()=>{
            //this.state.mytext = "取消收藏" 不用直接修改state
            this.setState({
                //mytext:"取消收藏"
                myName:'zhangsan',
                myShow:!this.state.myShow
            })//间接修改state
            if(this.state.myShow){
                console.log("收藏逻辑");
            }else{
                console.log("取消逻辑");
            }
        }}>{this.state.myShow?'收藏':'取消收藏'}</button>
      </div>
    )
  }
}
setState同步异步
  • setState处在同步的逻辑中,异步更新状态,更新真实dom
  • setState处在异步的逻辑中,同步更新状态,同步更新真实dom
  • setState接受第二个参数,第二个参数回调函数,状态和dom更新后就会被触发

🏓补充:React面试题

react事件绑定和普通事件绑定的区别

React并不会真正的绑定事件到每一个具体的《》元素上,而是采用事件代理的模式,绑定在根节点身上

Event对象

和普通浏览器一样,事件handler会被自动传入一个event对象,这个对象和普通的浏览器event对象所包含的方法和属性基本一致。不同的是React中的event对象并不是浏览器提供的,而是自己内部构建的。他同样具有event.stopPropagation、event.preventDefalut这种常用方法

🎉🎉🎉如有错误,请评论指出,thankyou~🎀🎀🎀

✨✨✨创作不易,如对您有帮助,欢迎给博主点赞收藏,给予鼓励哟💛

相关文章
|
9天前
|
前端开发 UED 索引
React 图片灯箱组件 Image Lightbox
图片灯箱组件是一种常见的Web交互模式,用户点击缩略图后弹出全屏窗口展示大图,并提供导航功能。本文介绍了基于React框架的图片灯箱组件开发,涵盖初始化状态管理、图片加载与预加载、键盘和鼠标事件处理等常见问题及解决方案。通过`useState`和`useEffect`钩子管理状态,使用懒加载和预加载优化性能,确保流畅的用户体验。代码案例展示了组件的基本功能实现,包括打开/关闭灯箱、切换图片及键盘操作。
107 80
|
8天前
|
移动开发 前端开发 JavaScript
React 视频播放器组件:Video Player
本文介绍了如何使用 React 和 HTML5 `&lt;video&gt;` 标签构建自定义视频播放器组件。首先,通过创建基础的 React 项目和 VideoPlayer 组件,实现了基本的播放、暂停功能。接着,探讨了常见问题如视频加载失败、控制条样式不一致、性能优化不足及状态管理混乱,并提供了相应的解决方案。最后,总结了构建高效视频播放器的关键要点,帮助开发者应对实际开发中的挑战。
53 27
|
11天前
|
前端开发 JavaScript API
React 图片放大组件 Image Zoom
本文介绍如何使用React创建图片放大组件(Image Zoom),提升用户体验。组件通过鼠标悬停或点击触发放大效果,利用`useState`管理状态,CSS实现视觉效果。常见问题包括图片失真、性能下降和移动端支持,分别可通过高质量图片源、优化事件处理和添加触摸事件解决。易错点涉及状态管理混乱、样式冲突和过多事件绑定,建议使用上下文API、CSS模块及优化事件绑定逻辑。高级功能扩展如多张图片支持和自定义放大区域进一步丰富了组件的实用性。
43 25
|
7天前
|
存储 编解码 前端开发
React 视频上传组件 Video Upload
随着互联网的发展,视频内容在网站和应用中愈发重要。本文探讨如何使用React构建高效、可靠的视频上传组件,涵盖基础概念、常见问题及解决方案。通过React的虚拟DOM和组件化开发模式,实现文件选择、进度显示、格式验证等功能,并解决跨域请求、并发上传等易错点。提供完整代码案例,确保用户能顺畅上传视频。
118 92
|
12天前
|
移动开发 前端开发 JavaScript
React 图片裁剪组件 Image Cropper
本文介绍了在React中实现图片裁剪功能的方法,涵盖基础知识、常见问题及解决方案。首先,通过第三方库如`react-image-crop`或`cropperjs-react`可轻松实现图片裁剪。接着,针对性能和兼容性问题,提供了优化图片加载、处理裁剪区域响应慢、解决浏览器差异等方案。最后,通过代码案例详细解释了如何创建一个基本的图片裁剪组件,并提出了优化建议,如使用`React.memo`、添加样式支持及处理大图片预览,帮助开发者避免常见错误并提升用户体验。
94 67
|
1月前
|
前端开发 UED 开发者
React 悬浮按钮组件 FloatingActionButton
悬浮按钮(FAB)是常见的UI元素,用于提供突出的操作。本文介绍如何在React中使用Material-UI创建美观的FAB组件,涵盖基本概念、实现方法及常见问题解决。通过代码示例和优化技巧,帮助开发者提升用户体验,确保按钮位置、颜色、交互反馈等方面的表现,同时避免无障碍性和性能问题。
127 80
|
1月前
|
前端开发 JavaScript 开发者
React 按钮组件 Button
本文介绍了 React 中按钮组件的基础概念,包括基本的 `&lt;button&gt;` 元素和自定义组件。详细探讨了事件处理、参数传递、状态管理、样式设置和可访问性优化等常见问题及其解决方案,并提供了代码示例。帮助开发者避免易错点,提升按钮组件的使用体验。
201 77
|
1月前
|
存储 前端开发 UED
React 面包屑组件 Breadcrumb 详解
面包屑导航是现代Web应用中常见的UI元素,帮助用户了解当前位置并快速返回上级页面。本文介绍如何使用React构建面包屑组件,涵盖基本概念、实现方法及常见问题。通过函数式组件和钩子,结合React Router动态生成路径,处理嵌套路由,并确保可访问性。示例代码展示了静态和动态面包屑的实现,帮助开发者提升用户体验。
158 73
|
1月前
|
前端开发 UED 开发者
React 对话框组件 Dialog
本文详细介绍了如何在 React 中实现一个功能完备的对话框组件(Dialog),包括基本用法、常见问题及其解决方案,并通过代码案例进行说明。从安装依赖到创建组件、添加样式,再到解决关闭按钮失效、背景点击无效、键盘导航等问题,最后还介绍了如何添加动画效果和处理异步关闭操作。希望本文能帮助你在实际开发中更高效地使用 React 对话框组件。
144 75
|
17天前
|
前端开发 JavaScript UED
React 拖拽排序组件 Draggable List
在现代Web应用中,拖拽排序功能显著提升用户体验。使用React结合`react-dnd`库,可以轻松创建高效且易于维护的拖拽排序组件。通过简单的拖拽操作,用户能直观调整列表项顺序,适用于任务管理、看板工具等场景。实现步骤包括项目初始化、安装依赖、创建基础组件、添加拖拽功能及管理状态和事件。常见问题如拖拽效果不流畅、顺序未更新等可通过性能优化、正确处理索引交换等方式解决。移动端支持也需考虑,确保跨平台的良好体验。
81 25