React初识

news/2024/11/29 6:50:23/

概述

  • React 是用于构建用户界面的 JS 库。
  • React 是 MVC 中薄薄的一层 V,把数据变成 DOM 显示出来,它只关注表现层。
  • React 原生就是函数 + 虚拟 DOM

特点 

  • 单向数据流

  • 兼容性更好:支持IE8

  • JSX语法:处理数据和 DOM 之间的关系,而不需要直接操作 DOM。jsx 是React.createElement 的语法糖。

  • 组件化:分为函数式组件和类组件。

  • 虚拟DOM:减少操作真实DOM,提升性能,便于和其他平台集成。

函数组件和类组件的异同 

  • 函数组件也叫无状态组件,是一个纯函数,它接收一个 props 对象,返回一个 react 元素。

  • 类组件需要去继承 React.Component ,接收一个 props 对象并且创建 render 函数返回 react 元素。

  • 类组件中的 state 数据处于自身本页面实例,不和别人共享,以防冲突,类似于 vue2data。

  • 生命周期:函数组件不存在生命周期;类组件的生命周期钩子函数继承自React.Component;

  • 状态管理:在React Hook出现之前,函数组件无状态;类组件有状态state(响应式数据);

  • React调用方式:函数组件直接调用; 类组件需要实例化,调用实例的render()方法;

  • 获取渲染的数据:类组件的this指向会变化;函数组件没有this;

  • React中props是不可变的,但this指向是可变的;

函数组件调用:直接调用

// 你的代码
function SayHi() {return <p> Hello,React </p>
}
// React内部
const result = SayHi(props) // <p>Hello, React</p>

类组件调用:先new实例化,再调用render方法

// 你的代码
class SayHi extends React.Component(render() {return <p> Hello,React </p>}
}
// React内部
const instance = new SayHi(props) //  SayHi()
const result = instance.render() // <p> Hello, React </p>

React注意事项:

  1. 不要在 jsx 语法中使用 if - else,可以使用三目运算、或运算、与运算;

  2. 不要在 jsx 语法中使用 for 循环, 使用 map 循环;

  3. 添加状态必须在构造方法,添加构造方法必须执行 super();

  4. 组件必须导入 React;  

【注】调用 super 后,才能使用 this:  因为 constructor 会覆盖父类的constructor,导致父类构造函数没执行,所以手动执行 super 继承;

示例

import React,{Fragment} from "react";
class App4 extends React.Component {constructor(props) {super(props)console.log('app3')this.state = {//类组件比函数组件多了一个响应数据 msg: 'helloworld',inputvalue:'黑鹰战机',list:['航空母舰','战斗巡洋舰2']}}inputChange=(e)=>{this.setState({inputvalue:e.target.value})}addList=(e)=>{this.setState({//类似于小程序风格 因为只有数据劫持才能进行直接赋值list:[...this.state.list,this.state.inputvalue]})}deleteItem=(index)=>{let newList = this.state.listnewList.splice(index,1)this.setState({list:newList})}render() {return (<Fragment><div><div><input value={this.state.inputvalue}  onChange={this.inputChange}/>                 <button onClick={this.addList}>增加战舰</button><ul>{this.state.list.map((item,index)=>((<li onClick = { this.deleteItem.bind(this,index) }key = {index} > {item}</li>)))}  </ul></div></div></Fragment>)}}
export default App4

JSX

JSX 是一个 JavaScript 的语法扩展,JSX表示在JS代码中写HTML结构,是React声明式的表现。JSX 是一个牺牲可读性,拥有 vue 模板特征,增强视图可编程性和编程效率的工具,灵活是优点,但并非没有代价。

优点:

  1. 方便,两种代码可以在一起混写,不用考虑不同文件类型如何组织的问题
  2. 可以将逻辑和视图交织写在一起,遇到列表,嵌套结构等逻辑视图时,思维负担比模板更小

缺点:

  1. 两种不同体系的语言元素写在一起,会显著降低可读性
  2. 短时间内不可能成为规范

React和Vue的区别

  • React 的思路是 HTML in JavaScript 也可以说是 All in JavaScript,通过 JavaScript 来生成 HTML,所以设计了 JSX 语法,还有通过 JS 来操作 CSS,社区的styled-component、JSS等。

  • Vue 是把 HTML,CSS,JavaScript 组合到一起,用各自的处理方式,Vue 有单文件组件,可以把 HTML、CSS、JS 写到一个文件中,HTML 提供了模板引擎来处理。

  • React 的核心思想是声明式渲染和组件化、单向数据流,它既不属于 MVC 也不属于 MVVM 架构。Vue采用 MVVM 架构。

  • React主要是通过 setState() 方法来更新状态,状态更新之后,组件也会重新渲染。

  • Vue 会遍历 data 数据对象,使用 Object.definedProperty() 将每个属性都转换为 getter 和setter,每个 Vue 组件实例都有一个对应的 watcher 实例,在组件初次渲染的时候会记录组件用到了那些数据,当数据发生改变的时候,会触发 setter 方法,并通知所有依赖这个数据的watcher 实例调用 update 方法去触发组件的 compile 渲染方法,进行渲染数据。


http://www.ppmy.cn/news/62775.html

相关文章

画图以及代码分析结合的循环队列的实现

循环队列的实现 概念以及结构实现初始化判空判满入队出队从队头获得元素从队尾获得元素释放 概念以及结构 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”…

17.provide.inject.下

学习要点&#xff1a; 1.provide.inject 本节课我们来要了解一下 Vue3.x 中的 provide.inject(提供.注入)功能&#xff1b; 一&#xff0e;provide.inject 1. 使用 Composition API&#xff0c;也是使用 import 导入来实现的&#xff1b; // App.vue import { ref, provide } f…

uni-app nvue页面中使用video视频播放组件

我遇到的问题是&#xff0c;在nvue页面引用video组件&#xff0c;然后啥也没显示的&#xff0c;显示了无法控制播放&#xff0c;折腾了好久&#xff0c;在这里记录下来&#xff01;希望可以帮助到需要的人 我的代码是这样的&#xff08;src换成官方的举例&#xff09; <vi…

Vue面试题:30道含答案和代码示例的练习题

Vue中的双向数据绑定是怎么实现的&#xff1f; 双向数据绑定通过使用v-model指令实现。v-model指令会在表单元素上创建一个监听器&#xff0c;在用户输入时实时更新Vue实例的数据&#xff0c;并且在Vue实例数据变化时更新表单元素的值。 如何在Vue中定义一个方法&#xff1f;…

【英语】大学英语CET考试,阅读部分1(阅读概述,SectionC仔细阅读140)

文章目录 1、阅读概述1.1 考试概况&#xff1a;大纲解读备考策略1.2 做题原则&#xff1a;定位1.3 标点符号和句子逻辑1.4 一级词汇 2、细节题&#xff08;10题占9题&#xff09;2.1 逻辑关系&#xff08;并列和递进&#xff0c;同一方向&#xff09;2.2 逻辑关系&#xff08;转…

数据库中全局锁、表级锁、行级锁的区别

一、全局锁&#xff08;锁数据库&#xff09; 会阻塞整个数据库的所有操作&#xff0c;只允许一个用户对数据库进行写操作&#xff0c;其他用户无法对数据库进行读写操作。经常用于对整个数据库进行备份或恢复等操作。 二、表级锁&#xff08;锁表&#xff09; 针对特定表的锁…

Java 中的包装类是什么?如何使用包装类来操作基本数据类型(二十二)

Java 中的包装类是一种特殊的类&#xff0c;用来将基本数据类型&#xff08;如 int、double、char 等&#xff09;包装成对象。包装类的作用是可以让基本数据类型具有对象的特性&#xff0c;比如可以作为参数传递给泛型类或方法&#xff0c;可以调用对象的方法&#xff0c;可以…

实现vercel的反向代理

实现 vercel 的反向代理 文章目录 实现 vercel 的反向代理vercel简介前言反向代理那么如何实现vercel的反向代理的呢&#xff1f; vercel简介 Vercel 是一家云服务提供商&#xff0c;旨在使 Web 应用程序的部署变得更加简单和快速。Vercel 的核心产品是 Next.js&#xff0c;它是…