根据Vue对比来深入学习React 上 函数组件 jsx 事件绑定 响应式数据 条件绑定 列表渲染 表单绑定

news2024/10/16 21:40:24

在这里插入图片描述

文章目录

      • React项目创建
      • React核心库介绍
      • React组件
      • jsx
        • 编写jsx代码的本质
        • jsx里面渲染不同内容
      • 事件绑定
        • 事件绑定其他操作
        • 特别注意
      • 响应式数据
        • `setState` 的特性
      • 条件渲染
      • 列表循环
      • 表单绑定
      • 总结

React项目创建

react官网提供了很多生产级的React框架
比如next.js,不过你还得学习next.js框架,
有点冗杂,下面文章会用vite来创建react项目

npx create-next-app@latest

使用create-react-app脚手架
此方法带警告 后续可能会删除

npx create-react-app app-name

使用vite创建,后续点React就行

pnpm create vite@latest

React核心库介绍

"dependencies": {
"react": "^18.3.1",
"react-dom": "^18.3.1"
},

React核心库:提供react的各个功能,比如生命周期,状态管理

react-dom:用于与浏览器的 DOM 进行交互提供一些dom操作方法用于把react创建出来的react对象挂载到真正的htmldom中,或者从htmldom中卸载。核心作用类似于vue的mount

//main.ts
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './App.tsx'
createRoot(document.getElementById('root')!).render(
//严格模式
<StrictMode>
<App />
</StrictMode>
)
//vue3中
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app');

我们可以看到:React 更加强调函数式编程hooks的使用,而 Vue 3 提供了更为直观的模板语法和灵活的 API

React组件

React的组件分类:

  1. 函数组件
//组件首字母一定要大写
function Test(){
	return <div></div>
}
  1. 类组件 淘汰了 不做过多赘述
import React, { Component } from 'react';

class SimpleCounter extends Component {

render() {

return (

<div>

<div>hello class</div>

</div>

);

}

}
export default SimpleCounter;

jsx

React项目利用babel做了对js的编译,所以我们是可以直接在js里混用jsx的

jsx和js一样,不同点就在于,可以更方便的写html在is里,写在js里的html最后会被编译成一个js对象,我们也可以用react自带createElement创建这个对象

编写jsx代码的本质
  1. 使用jsx 一个组件 加上尖括号当成html使用
  2. 写一段html
  3. 不借助jsx,直接用react.createElement方法
    react.createElement与vue中h方法类似都是创建生成虚拟 DOM 节点
    最后都会转化为React-element对象,让React解析对象,创建成页面。
jsx里面渲染不同内容
  • 字符串,数字都是直接渲染
  • 无法渲染方法
  • 对象 只能渲染element对象
  • 布尔值 不渲染任何内容
  • 数组 把数组里的每一项单独渲染
  • undefine,null 不渲染任何内容
  • 表达式 直接运行

事件绑定

在 React 中,事件处理函数通常是在 JSX 中直接绑定的,并且使用驼峰语法。比如onClick

而Vue中都是通过指令简写@。比如@click

//react
import React from 'react';
const MyComponent = () => {
const handleClick = () => {
console.log('Button clicked!');
};
return (
<button onClick={handleClick}>Click Me</button>
);
};
export default MyComponent;

//vue
<template>
<button @click="increment">Click Me</button>
<p>count</p>
<template>
<script setup>
 const count = ref(0); // 定义方法
  const increment = () => { count.value++; };
<script>
事件绑定其他操作

我们知道在Vue中直接传递参数就行了,那么在react又该怎么做呢?

<template>

<div>

<button @click="handleClick(1, $event)">Click Me</button>

</div>

</template>

  

<script setup>

handleClick(param, event) {

// 1. 传递参数

console.log('Parameter:', param);

  

// 2. 获取事件对象

console.log('Event:', event);

console.log('Target:', event.target); // 事件目标

  

// 3. 阻止默认行为和冒泡

event.preventDefault(); // 阻止默认行为

event.stopPropagation(); // 阻止事件冒泡

// 可以在这里执行其他操作

console.log('Default behavior prevented and event propagation stopped.');

}

</script>
  1. 传递参数
    方法传递参数时使用箭头函数包裹
const App = () => {

const handleClick = (param) => {

console.log(param);

};
return (

<div>

<button onClick={() => handleClick('Hello, World!')}>

Click Me

</button>

</div>

);

};
  1. 获取事件对象
//无参时
const App = () => {

const handleClick = (event) => {

console.log('Event:', event);

console.log('Button clicked:', event.target);

};
return (

<div>

<button onClick={handleClick}>

Click Me

</button>

</div>

);
//有参数时
function App() {

const handleClick = function(a:number,b:number,e:any){

console.log(a,b,e,e.target);

}

return (

<>

<button onClick={(e) => handleClick(1,2,e)}></button>

</>

)

}

export default App
  1. 阻止默认行为,冒泡等
import React from 'react';

const App = () => {

const handleSubmit = (event) => {

event.preventDefault(); // 阻止表单提交

console.log('Form submitted');

};

const handleButtonClick = (event) => {

event.stopPropagation(); // 阻止事件冒泡

console.log('Button clicked');

};

  

return (

<form onSubmit={handleSubmit}>

<button onClick={handleButtonClick}>

Submit

</button>

</form>

);

};

export default App;
特别注意

与Vue中的不同给到事件绑定的一定是一个方法,不要直接调用方法,调用方法会使页面初次渲染指向方法

响应式数据

React 不能像 Vue 一样直接修改触发更新
Vue:Vue 使用的是数据代理,当你直接修改数据属性时,Vue 的响应式系统会自动监测到这些变化,并触发视图的更新。这是因为 Vue 在内部使用Object.defineProperty 或 Proxy 来拦截对对象的访问和修改。
React:React 不会自动追踪数据的变化。如果你直接修改组件的状态(如通过直接赋值)React 并不会知道需要重新渲染组件。要触发更新,必须使用 setState()或 相应的Hooks 。这是因为 React 采用了声明式编程模型,更新状态后 React 会重新计算出需要渲染的组件

react修改能改值,但无法触发更新,因为react没有像vue一样监听get和set,而是在调用setState或相应的Hooks的时候调用的更新操作

import React, { useState } from 'react';

  

const Counter = () => {

const [count, setCount] = useState(0);

  

return (

<button onClick={() => setCount(count + 1)}>

{count}

</button>

);

};
export default Counter;
//输入框
import React, { useState } from 'react';

  

const TextInput = () => {

const [inputValue, setInputValue] = useState('');

  

const handleChange = (event) => {

setInputValue(event.target.value);

};

  

return (

<div>

<input type="text" value={inputValue} onChange={handleChange} />

<p>You typed: {inputValue}</p>

</div>

);

};


export default TextInput;

浅合并 在开发中常用

const UserForm = () => {

const [formData, setFormData] = useState({

name: '',

age: '',

email: ''

});
// 处理输入变化

const handleChange = (event) => {

const { name, value } = event.target;

// 使用浅合并来更新状态

setFormData((prevData) => ({

...prevData, // 浅合并之前的状态

[name]: value // 更新特定字段

}));

};
setState 的特性
  1. 合并更新
const handleClick = () => {
 setCount(count + 1); 
 setCount(count + 2); // 只有这次会生效
  };
//最后会为2
  1. 触发更新
    如果 newValue 等于当前 value,组件依然会重新渲染,这可能会影响性能,尤其是在频繁调用的情况下
const updateValue = (newValue) => { 
setValue(newValue);
 // 即使新值与当前值相同 };

r解决办法: 给个条件判断 使用函数式更新 或者调用useCallbalck和useMemo优化函数和计算值

const MyComponent = () => {

const [count, setCount] = useState(0);

const increment = () => {

const newCount = count + 1;

if (newCount !== count) {

setCount(newCount);

}

};

  

const MyComponent = () => {

const [count, setCount] = useState(0);

const increment = () => {

setCount(prevCount => prevCount + 1); // 返回新的状态,避免直接依赖 count

};

const MyComponent = () => {

const [count, setCount] = useState(0);

const increment = useCallback(() => {

setCount(prevCount => prevCount + 1);

}, []);
  1. 避免在render方法中使用
    render 方法中直接调用 setState 会导致无限循环,因为每次组件渲染都会调用 setState,从而触发新的渲染。这是非常不推荐的做法。正确的方法是在事件处理或生命周期方法中调用 setState
const MyComponent = () => {
const [count, setCount] = useState(0);
// 不要这样做:
// setCount(count + 1); // 会导致无限循环
return (

<div>

<p>{count}</p>

<button onClick={() => setCount(count + 1)}>Increment</button>

</div>

);
};

在 React 中,使用 setState 来更新数组和对象时,确实需要返回一个新的数组或对象。这是因为 React 使用浅比较来检测状态的变化,如果你直接修改原有的状态对象或数组,React 可能不会意识到这些变化,从而不触发重新渲染

import React, { useState } from 'react';

const MyComponent = () => {

const [state, setState] = useState({ name: 'zhaimou', age: 30 });

const updateName = () => {

setState(prevState => ({

...prevState,

name: 'zhai'

}));

};

return (

<div>

<p>Name: {state.name}</p>

<p>Age: {state.age}</p>

<button onClick={updateName}>Change Name</button>

</div>

);

};

条件渲染

在 Vue 中,条件渲染通常使用 v-ifv-else-ifv-else 指令。Vue 的模板语法使得条件渲染更加直观。

在 React 中,通常使用 JavaScript 表达式来进行条件渲染。可以使用 if 语句、三元运算符或者逻辑与(&&)操作符。

import React, { useState } from 'react';

  

const MyComponent = () => {

const [isLoggedIn, setIsLoggedIn] = useState(false);

return (

<div>

{isLoggedIn ? (

<h1>Welcome back!</h1>

) : (

<h1>Please log in.</h1>

)}

<button onClick={() => setIsLoggedIn(!isLoggedIn)}>

Toggle Login

</button>

</div>

);

};

列表循环

在 Vue 中,使用 v-for 指令进行列表渲染。与 React 类似,Vue 也要求每个列表项有一个唯一的 key 属性。

在 React 中,通常使用 map() 方法来遍历数组并生成组件。每个元素需要一个唯一的 key 属性以帮助 React 识别哪些项发生了变化、被添加或删除。

import React from 'react';

const ItemList = ({ items }) => {

return (

<ul>

{items.map((item, index) => (

<li key={item.id}>{item.name}</li> // 使用唯一的 id 作为 key

))}

</ul>

);

};

export default ItemList;

表单绑定

在 Vue 中,表单元素使用 v-model 指令进行双向数据绑定,@submit.prevent阻止默认的提交行为事件修饰符绑定

在 React 中,表单元素通常是“受控组件”,这意味着表单的值由 React 的状态管理。

import React, { useState } from 'react';

  

const MyForm = () => {

const [name, setName] = useState('');

  

// 处理输入框的变化

const handleChange = (event) => {

setName(event.target.value); // 更新状态为输入框的当前值

};

  

// 处理表单提交

const handleSubmit = (event) => {

event.preventDefault(); // 阻止默认的表单提交行为

alert(`提交的名称: ${name}`);

};

return (

<form onSubmit={handleSubmit}>

<label>

名称:

<input type="text" value={name} onChange={handleChange} /> {/* 受控组件 */}

</label>

<button type="submit">提交</button>

</form>

);

};

export default MyForm;

总结

Vue各种效果用指令编写,对于简单的控制非常容易
React各种效果都通过逻辑运算产出对应的内容渲染 能够完整控制整个过程 更少的封装,更高的自由度

本篇文章到这里就结束了 如果对你有所帮助就点个关注吧 会持续更新技术文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2209754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python+selenium工具UI自动化全功能介绍(包括工具本身及配合RobotFramework框架和pytest框架应用)

文章较长&#xff0c;各位志同道合的朋友们&#xff0c;感谢关注收藏。 书山有路勤为径&#xff0c;学海无涯苦作舟。 ——韩愈&#xff0c;以山川学海比喻学习的艰辛与努力的方向。 明天的我们&#xff0c;必将会感谢昨日的自己。 1 UI自动化测试 UI自动化测试&#xff08…

ACwing题目分享 756

这个题看起来比较简单&#xff0c;但实际上有些思维难度&#xff0c;现在想到的是模拟法&#xff0c;我们可以设好边界&#xff0c;然后从左上角开始遍历&#xff0c;沿着题目要求的顺序&#xff0c;沿着top left right bottom这四个边依次来做。 模拟过程有很多坑&#xff0c…

基于Python Django的在线考试管理系统

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

【花卉识别系统】Python+卷积神经网络算法+人工智能+深度学习+图像识别+算法模型

一、介绍 花朵识别系统。本系统采用Python作为主要编程语言&#xff0c;基于TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;并基于前期收集到的5种常见的花朵数据集&#xff08;向日葵、玫瑰、蒲公英、郁金香、菊花&#xff09;进行处理后进行模型训练&#xff0c;最…

(31)非零均值信号的时域分析:均值、方差、与功率

文章目录 前言一、使用MATLAB生成余弦波并画图二、计算信号的均值、方差、与功率三、结果分析 前言 本文对叠加了直流分量的一段整周期余弦信号进行时域分析&#xff0c;使用MATLAB进行信号生成&#xff0c;并计算其均值、方差、与功率。最后给出对计算结果的分析&#xff0c;…

Docker 教程二 (架构)

Docker 架构 Docker 包括三个基本概念: 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。容器&am…

【HKIE】2011 The HKIE Structural Examination

文章目录 2011 The HKIE Structural ExaminationQuestion 1 商业大厦 | Commercial Tower客户要求 | Clients Requirements荷载要求 | Imposed Loading场地条件 | Site Conditions不考虑的内容 | Omit from ConsiderationSection ASection B Question 2 办公大楼 | Office Buil…

管家婆-本地化-无法打开处理,链接失败

一、首先检测sql是否正常 二、检测管家婆svr是否正常 三、检测管家婆服务正常 阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术共享的浪潮中&#xff0c;不仅仅是作为受益者&#xff0c;更要成为贡献…

前端开发攻略---使用css实现滚动吸附效果

实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><style>…

【工具】音视频翻译工具基于Whisper+ChatGPT

OpenAI推出的开源语音识别工具Whisper&#xff0c;以其卓越的语音识别能力&#xff0c;在音频和视频文件处理领域大放异彩。与此同时&#xff0c;ChatGPT也在翻译领域崭露头角&#xff0c;其强大的翻译能力备受赞誉。因此&#xff0c;一些字幕制作团队敏锐地捕捉到了这两者的结…

Ubuntu卸载Mysql【ubuntu 24.04/mysql 8.0.39】

一、准备工作 查看ubuntu版本号 查看mysql版本号(如果没有安装mysql,这一步省略) 二、Ubuntu上卸载mysql(如果没有安装mysql这一步省略) 在Ubuntu上卸载MySQL可以通过以下步骤进行&#xff0c;确保完全移除MySQL相关的包和数据&#xff1a; 1. 停止MySQL服务 在卸载之前…

MySQL(B站CodeWithMosh)——2024.10.12(15)

ZZZZZZ目的ZZZZZZ代码ZZZZZZ重点ZZZZZZ操作&#xff08;非代码&#xff0c;需要自己手动&#xff09; 4- WITH OPTION CHECK子句 | THE WITH OPTION CHECK Clause_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1UE41147KC?p66&vd_sourceeaeec77dfceb13d96cce76cc2…

RabbitMQ 入门(三)SpringAMQP

一、Spring AMQP 简介 SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能&#xff1a; - 自动…

搭建`mongodb`副本集-开启权限认证 mongo:7.0.5

搭建mongodb副本集-开启权限认证 mongo:7.0.5 1.5.1、创建文件 创建配置文件保存目录和数据保存目录 mkdir -p /data/mongodb/{/conf,/data,/logs}生成和设置权限 这个文件一定要在一个服务里面生成然后复制到其它服务器&#xff0c;所有服务器的这个key一定是相同的。 op…

移动技术开发:保存密码和自动登录

1 实验名称 保存密码和自动登录 2 实验目的 掌握利用SharedPreference实现记住密码和自动登录功能。 3 实验源代码 布局文件代码&#xff1a; &#xff08;1&#xff09;activity_main.xml <?xml version"1.0" encoding"utf-8"?> <TableLa…

【深度学习】经典的深度学习模型-02 ImageNet夺冠之作: 神经网络AlexNet

【深度学习】经典的深度学习模型-02 ImageNet夺冠之作: 神经网络AlexNet Note: 草稿状态&#xff0c;持续更新中&#xff0c;如果有感兴趣&#xff0c;欢迎关注。。。 0. 论文信息 article{krizhevsky2012imagenet, title{Imagenet classification with deep convolutional n…

智能巡检机器人与智慧运维系统的结合应用

一、传统配电运维的困境 传统配电运维面临诸多难题。首先&#xff0c;劳动强度大&#xff0c;运维人员需要手持终端设备对配电站室内环境、电气设备上的各个仪器仪表参量等进行定时巡视&#xff0c;工作繁琐且易疲劳。其次&#xff0c;效率低下&#xff0c;巡查间隔时间较长&a…

构建高效购物推荐系统:SpringBoot实战

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

2014年国赛高教杯数学建模D题储药柜的设计解题全过程文档及程序

2014年国赛高教杯数学建模 D题 储药柜的设计 储药柜的结构类似于书橱&#xff0c;通常由若干个横向隔板和竖向隔板将储药柜分割成若干个储药槽(如图1所示)。为保证药品分拣的准确率&#xff0c;防止发药错误&#xff0c;一个储药槽内只能摆放同一种药品。药品在储药槽中的排列…

前端开发攻略---前端ocr图片文字提取功能

1、引入资源 通过链接引用 <script src"https://cdn.bootcdn.net/ajax/libs/tesseract.js/5.1.0/tesseract.min.js"></script> npm或其他方式下载 npm i tesseract 2、示例 <!DOCTYPE html> <html lang"en"><head><meta…