React小记(三)_函数组件的使用

1、创建项目

    npx create-react-app myReact

2、启动项目

    cd myReactnpm start

3、jsx语法

    1、只能有一个根标签/<></>2、所有标签必须闭合3、jsx语法要写在小括号()里面 !!!

4、插值 { }

    1、插值可以使用的位置标签内容标签属性2、{ }里面为js语句
【代码】
function App() {const divContent = '我是标签内容';const divTitle = '我是标签标题';return (<div title={divTitle}> { divContent }</div>);
}export default App;

5、条件渲染

    根据js手写逻辑
【情况一】
function App() {let divContent = null;const divTitle = '我是标签标题';const flag = true;if (flag) {divContent = <span>span</span>} else {divContent = <p>p</p>}return (<div title={divTitle}> { divContent }</div>);
}export default App;【情况二】
import { Fragment } from "react";function App() {const list = ['张三', '李四', '王五']const li = list.map((item, index) => (// 1、空标签中是不能加key的// <  key= { index }>//   <li >{item}</li>//   <li>------</li>// </>// 2、使用 react 提供的 Fragment<Fragment key={index}><li >{item}</li><li>------</li></Fragment>))return (<ul>{ li }</ul>);
}export default App;

6、列表渲染

    一样是通过数组方法map或者foreach等方法自己循环
function App() {const list = ['张三', '李四', '王五']// 这里一定要用()const li = list.map((item,index) => (<li key={index}>{item}</li>))return (<ul>{ li }</ul>);
}export default App;

7、事件绑定

  函数组件中无this
function App() {function handleClick(e){console.log('点击了按钮',e);}return (<button onClick={handleClick}>按钮</button>);
}export default App;

8、useState

8.1 基本使用

import {useState} from 'react'function App() {function handleClick(){setContent('已更改')}const [content, setContent] = useState('默认内容')return (<><div>{content}</div><button onClick={handleClick}>按钮</button></>);
}export default App;

8.2 对象一些细节

useState修改值是覆盖,不是追加
所以更改对象时,应该先解构,再追加
import {useState} from 'react'function App() {function handleClick() {// useState修改值是覆盖,不是追加setContent({...content,content:'新内容'})}const [content, setContent] = useState({title: '标题',content:'内容'})return (<><div title={ content.title}>{content.content}</div><button onClick={handleClick}>按钮</button></>);
}
export default App;

8.3 数组的一些细节

import { useState } from 'react'function App() {const [data, setData] = useState([{ id: 1, name: 'zhangsan' },{ id: 2, name: 'lisi' },{ id: 3, name: 'wangwu' },])const list = data.map(item => (<li key={item.id}> { item.name }</li>))function handleClick() {// useState修改值是覆盖,不是追加setData([...data,{id:4,name:'111'}])}return (<><ul>{ list}</ul><button onClick={handleClick}>按钮</button></>);
}export default App;

9、组件通信(父=>子)

9.1 为组件设置props

    1、className = '' 2、style = { { } }(1) 内联式:内部直接写(2) 外链式:使用变量(3) jsx展开语法,直接将所有的属性结构放在元素(不同于es6)

9.2 props 传值基本使用

    1、函数接收第一个参数为props 2、从中解构出标题和内容,方便后续使用
function Article( {title,content,active}) {return (<div><h3>{ title }</h3><p>{content}</p><p>{ active?'显示':'隐藏'} </p></div>)
}function App() {return (<><Article title='标题1' content='内容1' active /><Article title='标题2' content='内容2' /><Article title='标题3' content='内容3' active /></>);
}export default App;

9.3 插槽

    1、react中的插槽本质上就是props中的一个属性【children】2、父组件通过props向子组件传递html解构,子组件从【props的children】中取出

function List( {children} ) {return (<ul>{children}</ul>)
}function App() {return (<><List><li>内容</li><li>内容</li><li>内容</li></List></>);
}export default App;

10、组件通信(子=>父)

    1、父组件向子组件传递一个方法2、子组件接收该方法3、子组件在合适的时机调用并传参4、父组件拿到子组件的数据
import { useState } from "react";// 2、子组件接收该方法
function Detail( {onActice}) {const [status,setStatus] = useState(false)const handleClick = () => {setStatus(!status)// 3、在合适的时机调用并传参onActice(status)}return (<><button onClick={handleClick}> 点我切换</button><span style={{ display: status ? 'block' : 'none'}}>Detail的内容</span></>)
}function App() {// 4、父组件拿到子组件的数据const handle = (status) => {console.log(status);}return (// 1、向子组件传递一个方法<Detail onActice={ handle } />);
}export default App;

11、useReducer

    1、相较于 useState 更高效2、语法:[状态,分发方法] = useReducer(处理函数,初始值)const [state, dispatch] = useReducer(countReducer, 0)
import {useReducer} from 'react'
// 1、声明处理函数
function countReducer(state,actions) {switch (actions.type) {case 'add': return state +1case 'dec':return state - 1default:throw new Error()}
}
function App() {// [状态,分发方法] = useReducer(处理函数,初始值)// 2、使用useReducerconst [state, dispatch] = useReducer(countReducer, 0)const add = () => dispatch({type:'add'})const dec = () => dispatch({type:'dec'})return (<div style={{margin:'20px'}}><button onClick={dec}>-</button><span>{state}</span><button onClick={add}>+</button></div>)
}
export default App

12、useRef

  1、用来引用之前的值2、用来获取标签3、用来获取子组件以及子组件身上的方法

12.1 用来引用之前的值

import {useState,useRef} from 'react'function App() {const [count, setCount] = useState(0)// 1、定义表示变量const pre = useRef()const add = () => {// 2、使用 useRef 获取最新的值 pre.current = count;setCount( count+1 ) }return (<div style={{margin:'20px'}}><p>最新的count:{ count }</p><p>上次的count:{ pre.current}</p><button onClick={add}>增加count</button></div>)
}export default App

12.2 用来获取标签

import { useRef } from 'react'function App() {// 1、定义表示变量const input = useRef()const add = () => {// 3、使用 useRef 获取更新input的值 input.current.value = 1}return (<div style={{ margin: '20px' }}>{/* 2、绑定关联 */}<input type="text" ref={input} /><button onClick={add}>按钮</button></div>)
}export default App

12.3 用来获取子组件以及子组件身上的方法

    1、函数组件不是实例,所以无法直接获取子组件甚至其身上的方法2、可以借助 forwardRef useImperativeHandle 获取
import { useRef,forwardRef,useImperativeHandle } from 'react'// 2、使用 forwardRef 暴露组件
const Child = forwardRef(function (props, ref) {// 3、使用 useImperativeHandle 暴露函数useImperativeHandle(ref, () => ({myFn: () => {console.log('子组件的方法');}}))return (<h3>child</h3>)
})function App() {// 1、定义表示变量const child = useRef()// 4、获取到子组件的方法const getSon = () => {console.log(child.current);child.current.myFn()}return (<div ><h2>father</h2><Child ref={child} /><button onClick={getSon}>获取子组件</button></div>)
}export default App

13、useEffect

    (1). Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)(2). React中的副作用操作:发ajax请求数据获取设置订阅 / 启动定时器手动更改真实DOM(3). 语法和说明: useEffect(() => { // 在此可以执行任何带副作用操作return () => { // 在组件卸载前执行// 在此做一些收尾工作, 比如清除定时器/取消订阅等}}, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行(4). 可以把 useEffect Hook 看做如下三个函数的组合componentDidMount()componentDidUpdate()componentWillUnmount() 
// 1、相当于 componentDidMountuseEffect(() => {console.log('componentDidMount');}, [])// 2、相当于  componentDidUpdateuseEffect(() => {console.log(' componentDidUpdate');}, [state])// 3、相当于 componentWillUnmountuseEffect(() => {return () => {console.log('componentWillUnmount');}}, [state])// 4、componentWillUnmount 简写useEffect(() => () => {console.log('componentWillUnmount');}, [state])

14、useMemo 与 useCallback

    1、都用于【函数组件性能优化】,主要就是一个【缓存】2、useMemo 用来缓存【数据】 可以填依赖项3、useCallback 用来缓存【函数】 可以填依赖项4、类似于vue的【计算属性】

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

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

相关文章

使用 MPLS 解决 BGP 的路由黑洞

MPLS 协议并不会为通过 BGP 协议学习的路由条目分配标签号&#xff1b; 而是在访问这些 BGP 路由目标网段时&#xff0c;在流量中压入到达这些网段的 BGP 下一跳设备地址的标签号&#xff1b; 例&#xff1a;R2从BGP邻居5.5.5.5学习到6.6.6.0 网段的路由&#xff1b;R2在访问…

网络编程入门介绍:TCP 和 UDP

目录 简介TCP&#xff1a;传输控制协议 TCP 的特点TCP 如何工作TCP 示例TCP 实践样例 UDP&#xff1a;用户数据报协议 UDP 的特点UDP 如何工作UDP 示例UDP 实践样例 TCP 与 UDP 的比较总结 简介 在计算机网络中&#xff0c;TCP&#xff08;传输控制协议&#xff09;和 UDP&a…

2024年6月15日 十二生肖 今日运势

小运播报&#xff1a;2024年6月15日&#xff0c;星期六&#xff0c;农历五月初十 &#xff08;甲辰年庚午月庚戌日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;兔、马、虎 需要注意&#xff1a;牛、鸡、龙 喜神方位&#xff1a;西北方 财神方位&#xff1a;…

【数学】如何求解矩阵的特征值和特征向量

文章目录 如何求解矩阵的特征向量背景公式示例题目详细讲解Python代码求解实际生活中的例子本质解释 如何求解矩阵的特征向量 背景 特征向量和特征值是线性代数中的重要概念&#xff0c;广泛应用于物理学、计算机科学&#xff08;如机器学习、图像处理&#xff09;和统计学等…

摄像头校准之白平衡畸变坏点

摄像头校准之白平衡&畸变&坏点 1. 源由2. 校准内容3. 畸变校准一、畸变模型二、校准步骤1. 准备工作2. 特征点检测3. 计算内参数和畸变系数4. 畸变校正 三、验证和优化1. 视觉验证2. 误差评估3. 参数优化 4. 白平衡校准一、白平衡基础二、自动白平衡&#xff08;AWB&am…

AI 客服定制:LangChain集成订单能力

为了提高AI客服的问题解决能力&#xff0c;我们引入了LangChain自定义能力&#xff0c;并集成了订单能力。这使得AI客服可以根据用户提出的问题&#xff0c;自动调用订单接口&#xff0c;获取订单信息&#xff0c;并结合文本知识库内容进行回答。这种能力的应用&#xff0c;使得…

使用powershell筛选AD域控不能自主更改的用户并变更

# 查询“用户不能更改密码”为勾选状态的所有域用户&#xff0c;将域账户、姓名、勾选状态作为结果保存到C:\result\result.csvGet-ADUser -Filter * -Properties CannotChangePassword | Where-Object { $_.CannotChangePassword -eq $true } | Select SamAccountName, Name, …

班子考核评价的重要性与实施方法

在组织管理领域&#xff0c;班子考核评价是一项至关重要的工作&#xff0c;它不仅关系到组织的发展方向和速度&#xff0c;更直接影响到组织的凝聚力和战斗力。一个科学、公正、有效的班子考核评价体系&#xff0c;能够准确反映班子的工作成效&#xff0c;激励班子成员积极作为…

QML学习及实战

QML学习及实战&#xff08;更多内容&#xff09; 创建项目 3. 剩下的就是一路下一步即可 添加静态资源——图片 添加之后完成之后的路径 案列 || demo 可以参考的资料&#xff1a;https://github.com/gongjianbo/MyTestCode/blob/master/README.md 1. 文本省略号 Text {wi…

第二十三节:带你梳理Vue2:Vue插槽的认识和基本使用

前言: 通过上一节的学习,我们知道了如何将数据从父组件中传递到子组件中, 除了除了将数据作为props传入到组件中,Vue还允许传入HTML, Vue 实现了一套内容分发的 API&#xff0c;这套 API 的设计灵感源自 Web Components 规范草案&#xff0c;将 <slot> 元素作为承载分发…

java面试:Redis事务的相关命令

MULTI:标记一个事务块的开始。 EXEC:执行所有在 MULTI 开始之后&#xff0c;EXEC 执行之前添加到队列中的命令。 DISCARD:取消事务&#xff0c;清空事务队列中已入队的所有命令。 WATCH:监视一个或多个键&#xff0c;一旦其中任何一个键被修改&#xff0c;服务器将拒绝执行事务…

从零开始! jupyter notebook的安装教程

Jupyter Notebook 是一个开源的 web 应用程序&#xff0c;可以创建和共享包含代码、方程、可视化和文本的文档。它广泛用于数据清理和转换、数值模拟、统计建模、机器学习等数据科学领域。以下是从零开始安装 Jupyter Notebook 的详细步骤。 ### 步骤 1: 安装 Python Jupyter…

系统思考与创新解决

结束了为期两天的《系统思考与创新解决》课程&#xff0c;专为上市公司中后台管理者设计。这次课程让我深刻感受到中后端管理者与前端管理者在心智模式上的显著差异。通过使用系统环路图&#xff0c;不仅揭示了这些差异&#xff0c;还探讨了如何利用这些见解来增强团队间的对话…

13. 第十三章 案例研究-选择数据结构

13. 案例研究-选择数据结构 到这里尼应该已经学会了Python的核心数据结构, 也见过了一些使用它们的算法. 如果你想要更多地了解算个发可以阅读第21章. 本章配合联系介绍一个案例分析, 帮你思考如何选择数据结构并如何使用它们.13.1 单词频率分析 1. 练习1 编写一个程序, 读入…

《站在2024年的十字路口:计算机专业是否仍是高考生的明智之选?》

文章目录 每日一句正能量前言行业竞争现状行业饱和度和竞争激烈程度[^3^]新兴技术的影响[^3^]人才需求的变化[^3^]行业创新动态如何保持竞争力 专业与个人的匹配度判断专业所需的技术能力专业核心课程对学生的要求个人兴趣和性格特点专业对口的职业发展要求实践和经验个人价值观…

vue+intro.js实现引导功能

前言&#xff1a; 使用 intro.js这个插件&#xff0c;来实现一个引导性的效果&#xff0c;适用场景&#xff0c;比如&#xff1a;新手引导页&#xff0c;操作说明等等 效果图&#xff1a; 官网地址&#xff1a;点我 实现步骤&#xff1a; 1、安装 npm install intro.js --sa…

【AnimateAnyone】姿态可控视频生成模型训推,让图片里的人物动起来!

1. 模型简介 Animate Anyone是一项角色动画视频生成技术&#xff0c;能将静态图像依据指定动作生成动态的角色动画视频。该技术利用扩散模型&#xff0c;以保持图像到视频转换中的时间一致性和内容细节。训练由两阶段组成&#xff0c;对不同组网成分进行微调。具体实现借鉴于M…

【架构之路】聊聊什么是微服务

如何让大模型更聪明&#xff1f; 引言 微服务&#xff08;Microservices&#xff09;是一种软件架构风格&#xff0c;它将单一的应用程序拆分为多个小的服务&#xff0c;每个服务都是独立运行和部署的。每个微服务通常只专注于一个业务功能&#xff0c;具有自己的数据存储&…

JavaScript 实现数字计数器的动画效果

写JavaScript 实现数字递增的效果 在HTML页面实现数字计数器的动画效果&#xff0c;类似于页面上的计数器功能&#xff0c;可以控制递增速度和效果的流畅度。主要是显示数字时流畅度更好&#xff0c;页面没那么僵硬 1、第一种 设置每次增加的数量&#xff0c;我这里演示的是…

【UIDynamic-动力学-UIGravityBehavior-重力行为 Objective-C语言】

一、UIGravityBehavior,重力行为, 1.接下来啊,我们一个一个来做, 新建一个项目,叫做:01-重力, 接下来,我们在这个ViewController里边, ViewDidLoad:里边,先写一段简单的代码, 我们写这么一段简单的代码,新建一个红色的UIView,把它显示在屏幕上, UIView *redVie…