当前位置: 首页 > news >正文

网站建设软件定制开发做微商如何引流推广怎么找客源

网站建设软件定制开发,做微商如何引流推广怎么找客源,南宁网站如何制作,怎么注册网站个人useState useState用于在函数组件中声明和管理状态 它接受初始状态#xff0c;并返回一个状态变量和一个更新状态的函数 通过调用更新状态的函数#xff0c;可以改变状态的值并触发组件的重新渲染 import { useState } from reactfunction App() {const [obj, …useState useState用于在函数组件中声明和管理状态 它接受初始状态并返回一个状态变量和一个更新状态的函数 通过调用更新状态的函数可以改变状态的值并触发组件的重新渲染 import { useState } from reactfunction App() {const [obj, setObj] useState({a: 1,b: 2})const [arr, setArr] useState([])const updateObjValue () {// 更新引用值的状态必须传递一个新的引用setObj(prev {return {...obj,b: 3}})setArr(prev [...arr, 1])}return (div onClick{updateObjValue}a: {obj.a}b: {obj.b}数组{arr}/div) }export default App;useEffect React的useEffect钩子可以让开发者在函数组件中管理副作用。 副作用操作是指那些与组件渲染无关的操作例如访问网络、获取浏览器窗口大小、访问本地存储等。这些操作一般会产生一些副作用例如更新组件状态、改变浏览器地址等。 使用useEffect可以在组件渲染后执行副作用操作并且可以根据需要设置条件只在满足条件时执行副作用操作从而避免不必要的计算和网络请求。 useEffect接收两个参数第一个参数是一个回调函数该函数会在组件渲染之后执行用于执行副作用操作。 如果需要在组件卸载时执行一些清理操作可以在该函数中返回一个清理函数React会在组件卸载时调用该函数(如清除定时器等)。 第二个参数是一个可选数组用于指定当依赖项发生变化时是否需要重新执行effect函数。 如果第二个参数为空数组则表示effect只会在组件挂载和卸载时执行一次如果第二个参数不为空数组每当指定的依赖项发生变化时effect函数都会重新执行。 // 监听count的变化重新渲染 import React, { useState, useEffect } from react;function MyComponent(props) {const [count, setCount] useState(0);useEffect(() {document.title You clicked ${count} times;}, [count]);return (divpYou clicked {count} times/pbutton onClick{() setCount(count 1)}Click me/button/div); }请求网络 import { useState, useEffect } from react;function Example() {const [data, setData] useState(null);useEffect(() {fetch(https://api.example.com/data).then(response response.json()).then(data setData(data));}, []);return (div{data h1{data.title}/h1}/div); }通过useEffect来获取数据 import {useEffect, useState} from react;const UseEffectDemo () {const [list, setList] useState([])const [id, setId] useState(5433d5e4e737cbe96dcef312)const [num, setNum] useState(0)const [info, setInfo] useState([])useEffect((){const requestList async () {try {const response await fetch(https://cnodejs.org/api/v1/topics)const res await response.json()console.log(res[data])setList(res[data])} catch (err) {if (err) throw Error}}requestList().then((rs){console.log(requestList)})},[])useEffect((){const requestInfo async () {try {const response await fetch(https://cnodejs.org/api/v1/topic/ id)const res await response.json()setInfo(res[data])} catch (err) {if (err) throw Error}}requestInfo().then((rs){console.log(requestInfo)})},[id])return (h2 idtitleUseEffect Demo/h2h4{id}/h4div style{{display:flex}}ul{list.map((item, index){return (likey{item.id}style{{background:index num ? skyblue:white, cursor:pointer}}onClick{(){setId(item.id)setNum(index)}}{item.id}/li)})}/uldiv dangerouslySetInnerHTML{{__html: info.content}}/div/div/) } export default UseEffectDemouseEffect是异步执行的useLayoutEffect是同步执行的。 useLayoutEffect是当浏览器把内容渲染到页面之前执行而useEffect是当浏览器把内容渲染到页面之后执行。尽可能使用标准的useEffect以避免阻塞页面更新。 useEffect的运行规则组件首次渲染工作完成并将真实dom生成到页面以后将对应的回调函数推入异步队列等待执行 useLayoutEffect的运行规则组件首次渲染工作完成并将真实dom生成到页面以后将对应的回调函数推入同步队列等待执行 正常情况全部使用useEffect只有逼不得已的情况才考虑是否使用useLayoutEffect import { useState, useEffect } from react;export default function TopicList() {const [topicList, setTopicList] useState([])useEffect(() {const requestList async () {try {const response await fetch(https://cnodejs.org/api/v1/topics)const res await response.json()console.log(res[data])setTopicList(res[data])} catch (err) {if (err) throw Error}}requestList().then((rs){console.log(requestList)})const topicListDom document.getElementsByClassName(topic-list-wrapper)[0]console.log(topicListDom, topicListDom)}, [])return (div classNametopic-list-wrapper{topicList.map(topic (div key{topic.id}{topic.title}/div))}/div) }清除定时器 import { useState, useEffect } from react;export default function Tick() {const [tickTime, setTickTime] useState(100)useEffect(() {let timer setInterval(() {console.log(tickTime working)setTickTime(prev prev - 1)}, 1000);return () {clearInterval(timer)timer null}}, [])return (div倒计时: {tickTime}/div) }useReducer useReducer是另一种让函数组件保存状态的方式 它接受一个 reducer 函数和一个初始状态并返回当前状态和 dispatch 函数 import { useReducer } from react;export default function ReducerDemo() {const reducer (state, action) {switch (action.type) {case increment:return state 1case decrement:return state 1 }return state;}const [count, dispatch] useReducer(reducer, 0)return (divspan{count}/spanbutton onClick{() dispatch({ type: increment })}plus/button/div) }useCallBack 每次组件的重新渲染都意味着内部所有的引用值都会被重新构建 useCallBack用来长期稳定的维护某一个函数的引用它会将函数创建后的引用保存当函数组件下一次重新渲染时它会直接返回之前保存的引用而不是重新创建引用 useCallBack只在创建函数引用的时候使用 import {useState, memo, useCallback} from react;const Child memo(({value,change}) {console.log(----re-render----)return (input typetext value{value} onChange{change}/) })const UseCallback () {const [v1, setV1] useState()const [v2, setV2] useState()const onChange1 useCallback((e){setV1(e.target.value)}, [])const onChange2 useCallback((e){setV2(e.target.value)}, [])return (h2UseCallback/h2Child value{v1} change{onChange1}/Child value{v2} change{onChange2}//) } export default UseCallbackuseMemo useMemo类似于计算属性 useCallBack就是useMemo实现的用来做缓存的 useCallBack第一个参数也是一个函数并不会在声明时被React直接执行该函数会在组件渲染过程中被 useMemo 钩子调用将计算结果进行缓存 第二个参数是依赖项当依赖项变化时React会重新执行对应的第一个参数然后拿到最新的返回值再次进行缓存 业内都是使用useCallBack去缓存函数 memo方法 性能优化如果本组件中的数据没有发生变化阻止组件更新 import { memo } from react;function MemoDemo() {console.log(memo rendering...)return (divmemo data/div) }export default memo(MemoDemo)自定义hooks 使用自定义 hook 时需要遵循以下规则 自定义 hook 必须是一个函数名称必须以“use”为前缀。自定义 hook 可以调用其他钩子或普通函数。自定义 hook 应该使用 useState、useEffect 等 React 钩子创建状态和处理副作用。可以将自定义钩子与 useContext 和 useReducer 配合使用来实现更复杂的行为。 下面是一个示例自定义 hook用于检查用户是否拥有特定的权限 import { useState, useEffect } from react;function useUserPermissions(permission) {const [hasPermission, setHasPermission] useState(false);useEffect(() {// 模拟 Ajax 请求获取用户权限const userPermissions [admin, editor];if (userPermissions.includes(permission)) {setHasPermission(true);} else {setHasPermission(false);}}, [permission]);return hasPermission; } 在其他组件中使用 hook 检查用户是否拥有访问特定页面或功能的权限 import React from react; import useUserPermissions from ./useUserPermissions;function Dashboard() {const hasAccess useUserPermissions(admin);return (div{hasAccess ? (h1Welcome to the Admin Dashboard!/h1) : (h1Sorry, you do not have access to this page./h1)}/div); }显示loading效果 新建文件useRequestLoadingDispatcher.js import { useState } from react;export default function useRequestLoadingDispatcher() {const [loading, setLoading] useState(false)const executeRequest async (promiseFn) {setLoading(true)console.log(loading data........................)await promiseFn()setLoading(false)console.log(init finish)}return {loading, executeRequest} }使用useRequestLoadingDispatcher import { useState, useEffect } from react; import TopicItem from ../TopicItem; import useRequestLoadingDispatcher from ../hooks/useRequestLoadingDispatcher;export default function TopicList() {const [topicList, setTopicList] useState([])const {loading, executeRequest} useRequestLoadingDispatcher()const fetchFromServer async () {// 延时模拟加载中const delay async (duration 2000) {return new Promise((resolve, reject) {setTimeout(() {resolve()}, duration)})}executeRequest(async () {try {const response await fetch(https://cnodejs.org/api/v1/topics)const res await response.json()console.log(res[data])await delay(2000)setTopicList(res[data])} catch (err) {if (err) throw Error}})} useEffect(() {fetchFromServer()}, [])return (div classNametopic-list-wrapper{ loading ? div数据加载中/div : (topicList.map(topic (TopicItem {...topic}/TopicItem)))}/div) }强制刷新useForceUpdate import { useState } from react;export default function useForceUpdate() {const [_, setForceObj] useState({})const forceUpdate () {setForceObj({})}return forceUpdate; }使用强制刷新 import useForceUpdate from ../hooks/useForceUpdate export default function ForceUpdateTest() {console.log(do force update)const forceUpdate useForceUpdate()return (button onClick{forceUpdate}force update/button) }useRef 构建一个状态出来但是这个状态是直接脱离React控制的也不会造成页面的重新渲染同时状态还不会因为组件的重新渲染而被初始化 import { useState, useCallback, useRef } from react; export default function Ticker() {const [timeCount, setTimeCount] useState(60)const timerIdRef useRef(null)// useRef会返回一个对象里面有一个current属性// ref是可读可写的console.log(timerIdRef, timerIdRef)const startTick useCallback(() {timerIdRef.current setInterval((){setTimeCount(prev prev - 1)}, 1000)})const stopTick useCallback(() {if (timerIdRef.current) clearInterval(timerIdRef.current)})return (button onClick{startTick}start/buttonbutton onClick{stopTick}stop/buttonspan{timeCount}/span/) }使用useRef获取DOM元素 import { useCallback, useEffect, useRef } from reactexport default function TestInput() {const inputElementRef useRef(null)useEffect(() {inputElementRef.current document.getElementsByClassName(input-example)[0]}, [])const handleClick useCallback(() {inputElementRef.current.focus()})return (divinput classNameinput-example/inputbutton onClick{handleClick}click me/button/div) }useRef可以直接作用在dom上它使用useEffect去获取真实dom并且赋值 import { useCallback, useRef } from reactexport default function TestInput() {const inputElementRef useRef(null)const handleClick useCallback(() {inputElementRef.current.focus()})return (divinput ref{inputElementRef} classNameinput-example/inputbutton onClick{handleClick}click me/button/div) }fowardRef fowardRef是一个高阶组件 高阶组件接收一个组件作为参数返回一个新的组件 fowardRef给函数组件扩展了一个ref属性 TestInput.jsx import { forwardRef } from react// 给组件挂载ref属性必须使用forwardRef function TestInput(props, parentRef) {return (divinput ref{parentRef} classNameinput-example/input/div) }export default forwardRef(TestInput)App.js forwardRef一般都是和组件ref连用的不会单独使用 import { useCallback, useRef } from react; import TestInput from ./components/TestInput;function App() {const testInputRef useRef(null)const handleClick useCallback(() {testInputRef.current.focus()})return (divTestInput ref{testInputRef}/button onClick{handleClick}click me/button/div) }export default App; useImperativeHandle 用于向父组件暴露子组件实例的特定函数。它通常与forwardRef一起使用在子组件中定义外部可以调用的实例方法。 在子组件中使用forwardRef将ref作为第二个参数传递给子组件第三个参数是依赖项 const ChildComponent forwardRef((props, ref) {// 定义需要暴露给父组件的方法useImperativeHandle(ref, () ({// 这里定义需要暴露给父组件的方法focus: () {// 在这里编写具体的逻辑// 注意这里的 focus 是一个示例你可以定义任何你需要的方法// 你可以在该方法内部执行子组件的某个操作// 这个方法会被父组件调用},// 定义其他的方法...}));// 渲染子组件的 JSXreturn div子组件/div; });export default ChildComponent;在父组件中创建一个ref对象并将其传递给子组件 import React, { useRef } from react; import ChildComponent from ./ChildComponent;const ParentComponent () {// 创建 ref 对象const childRef useRef();// 在父组件中可以通过调用子组件的方法来访问子组件的实例const handleClick () {childRef.current.focus(); // 调用子组件的 focus 方法};return (divbutton onClick{handleClick}调用子组件方法/buttonChildComponent ref{childRef} //div); };export default ParentComponent;useContext 允许组件之间通过除了props以外的情况去共享数据 如果组件属性传递超过了4层可以考虑使用上下文 上下文大多数是用来做全局数据管理的 创建上下文context/themeContext.js import { createContext } from react;const ThemeContext createContext(light)export default ThemeContext给自定义上下文设置值 import { useCallback, useState } from react; import ThemeContext from ./context/themeContext; import TestInput from ./components/TestInput;function App() {const [theme, setTheme] useState(light)const changeTheme useCallback(() {setTheme(prev {if (prev light) return darkreturn light})})return (div classNamewrapperThemeContext.Provider value {theme}TestInput /button onClick{changeTheme}change theme/button/ThemeContext.Provider/div) }export default App;在组件中获取上下文中的值 import { useContext } from react import ThemeContext from ../../context/themeContextexport default function TestInput(props) {const contextValue useContext(ThemeContext)return (div style{{background: contextValue light ? #fff : #666}}input/input/div) }
http://www.hkea.cn/news/14575942/

相关文章:

  • txt怎么做网站官方网站车联网是谁做
  • 门户网站的自身的特性有可以花钱让人做问券的网站吗
  • 阿里巴巴国际站关键词推广重庆网站建设优斗士
  • 网站开发技术期末考试试题公司网站制作策划
  • 外国做挂的网站是多少wordpress 网站备案
  • 网站后台密码忘记了网页搜索功能怎么实现
  • 做网站时兼容分辨率广东 网站经营性备案
  • 网站建设方式有哪些东莞网站优化费用
  • 合肥专业做网站的公司有哪些购物网站排名 2019
  • 花钱人做的网站做好后算谁的聊天软件开发流程
  • 做电影网站犯法吗企业网站的开发公司
  • 做网站网页需要什么软件从化手机网站建设
  • 查看网站架构网站权重查询接口
  • 物流行业网站建设方案wap网页制作教程
  • 几种语言的网站如何做wordpress 摘要 回车
  • 企业可以做哪些网站有哪些内容吗坦桑尼亚网站域名后缀
  • 顺德网站建设7starryphp网站上传教程
  • 网站空间没有续费做影评的网站模版
  • 利用js做网站上海网页制作服务商
  • 福州建网站哪家好wordpress花园视频教程
  • 代做淘宝联盟网站网站流程
  • 南沙做网站公司网站页面设计怎么收费
  • 做外贸商城网站万网做网站吗
  • 镇江网站建设找思创佛山网站建设专家评价
  • 网站建设用电脑深圳别墅装修设计公司报价
  • ps怎么做网站界面设计服装设计网上自学课程
  • 互联网站安全古网站典模板
  • 宣城网站 建设青州网站建设qzfuwu
  • wordpress跳转手机站seo优化在线诊断
  • 注册域名查询网站官网大连大连建设工程信息网站