主頁 > 企業開發 > React筆記-Hooks(九)

React筆記-Hooks(九)

2023-05-23 09:12:25 企業開發

React筆記-Hooks(九)

Hooks

概念

React Hooks 的意思是 組件盡量寫成純函式 如果需要外部功能和副作用 就用鉤子把外部代碼"鉤"進來

函陣列件和類組件區別

  • 函陣列件沒有狀態(state) 類組件有
  • 函陣列件沒有生命周期 類組件有(掛載-更新-銷毀)
  • 函陣列件沒有this 類組件有
  • 函陣列件更適合做UI展示 類組件更適合做復雜的業務邏輯組件

為什么純函陣列件逐漸取代類組件

React團隊希望 組件不要變成復雜的容器 最好只是資料流的管道 開發者根據需要 組合管道即可

Hooks用法

useState() 狀態鉤子

純函陣列件沒有狀態,useState()用于設定和使用組件的狀態屬性

// Hooks是無狀態的 所以用這種方式替換類組件中的狀態(state)
const [state, setState] = useState(initialValue);
// state:初始的狀態屬性,指向狀態當前值,類似this.state
// setState:修改狀態屬性值的函式,用來更新狀態,小駝峰命名
// setState((currentState) => {]})可以傳入一個函式 函式接收一個引數 用于存放當前state
// initialValue:狀態的初始值,該值會賦給state

import { useState } from 'react';



function LearnHooks () {

    let a = 1;
    const [num, setNum] = useState(0);
    const [name, setName] = useState([{name : 'bob', age : 18}, {name : 'sam', age : 20}, {name : 'kitty', age : 22}]);

    const addNum = () => {
        setNum(num + 1)
        // setNum是異步操作 所以console.log(num)輸出的是更新前的值
        console.log(num)
        a += 1;
        // 這里a永遠輸出為2
        // 原因是hooks重新渲染是自呼叫 每次都會重新把a設為1 然后執行 a + 1
        console.log(a)
    }

    console.log('LearnHooks渲染了')
    return (
        <div>
            <h1>學習hooks的userState</h1>
            <div>當前num : {num}</div>
            <button onClick={() => addNum()}>num + 1</button>
            <div>{name.map((item) => {
                    return <div key={item.name}>name : {item.name}, age : {item.age}</div>
                })}
            </div>
            <input type="text" onChange={ ({target : {value}}) => setName([{name : value}])}/>
        </div>
    );
    
}

export default LearnHooks;

useEffect() 副作用鉤子

可以實作特定的功能 如異步請求

useEffect(() => {
    // 回呼函式,其中是要進行的異步操作代碼
    return () => {}
    // useEffect中的return陳述句可以用于清除effect產生的副作用,當組件卸載時,React會執行return陳述句中的函式,以清除effect產生的副作用,例如,如果在useEffect中訂閱了一個事件,那么在return陳述句中取消訂閱可以避免記憶體泄漏,
}, [array])
// [array]:useEffect執行的依賴,當該陣列的值發生改變時,回呼函式中的代碼就會被執行
// 如果[array]省略,則表示不依賴,在每次渲染時回呼函式都會執行
// 如果[array]是空陣列,即useEffect第二項為[],表示只執行一次

import React, { useState, useEffect } from 'react';

function hook() {

  const [num, setNum] = useState(1)
  /**
   * 第一個引數是回呼函式
   * 第二個引數是依賴項
   * 每次num變化時都會變化
   * 
   * 注意初始化的時候,也會呼叫一次
   */
  useEffect(() => {
    console.log("每次num,改變我才會觸發")
  }, [num])


  return (
    <div>
      <button onClick={() => setNum(num + 1)}>+1</button>
      <div>你好,react hook{num}</div>
    </div>
  );
}

export default hook;

useLayoutEffect()

useLayoutEffect是React提供的一個Hook,與useEffect功能類似,但在組件更新DOM前執行,而不是之后,

與useEffect不同的是,useLayoutEffect會阻塞瀏覽器渲染,并立即同步執行副作用函式,這可以確保使用組件的代碼看到的是最新的DOM布局,因為它們在組件掛載或更新時都會在渲染通道中優先處理,

// useLayoutEffect接收兩個引數:一個副作用函式和一個依賴項陣列,副作用函式中可以進行DOM操作、計算布局等任務,并且可以通過回傳一個清除函式來清理副作用產生的任何資源,

useLayoutEffect(() => { 副作用函式執行邏輯 }, [ 依賴項 ])

// 1. 撰寫副作用函式:useLayoutEffect需要傳遞一個函式作為引數,該函式稱為副作用函式,在這個函式里,你可以訪問到DOM、執行異步操作或計算等其它操作,并考慮它們的收尾作業,當組件的props或state發生變化時,都將重新運行該函式,
import { useLayoutEffect } from 'react';

function useMyLayoutEffect() {
  // 執行DOM相關操作
  return () => {
    // 清理作業
  };
}


// 2. 將useLayoutEffect掛載到組件:要在組件中使用useLayoutEffect這個函式,只需要呼叫它即可,并把上一步撰寫的副作用函式作為第一個引數,

function MyComponent() {

  useLayoutEffect(useMyLayoutEffect, []);

  return <div>Hello, world!</div>;

}


// 給useLayoutEffect傳遞依賴項陣列:和useEffect一樣,useLayoutEffect的第二個引數是一個陣列,其中包含在副作用函式中需要被“監視”的任何變數,當其中的變數發生更改時,useLayoutEffect將重新運行其副作用函式,

function MyComponent({ name }) {

  useLayoutEffect(() => {

    console.log(`MyComponent is mounted: ${name}`);

  }, [name]);

  return <div>Hello, {name}!</div>;
  
}

useContext() 共享狀態鉤子

可以共享狀態,作用是進行狀態的分發,避免了使用Props進行資料的傳遞

// 第一步:創建全域的Context
const AppContext = React.createContext([初始化引數])

// 第二步:通過全域的Context進行狀態值的共享
<AppContext.Provider value=https://www.cnblogs.com/SpicyPeper/archive/2023/05/22/{{ 屬性名: 值 }}>
    <其他組件1 />
    <其他組件2 />


// 第三步:使用context
const context = useContext(AppContext);
{context.name}

// 在 App.js 檔案中
import React, { createContext, useState } from 'react';
import Child from './Child';

export const MyContext = createContext();

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

  return (
    <MyContext.Provider value=https://www.cnblogs.com/SpicyPeper/archive/2023/05/22/{{ count, setCount }}>
      

Count: {count}

); } // 在 Child.js 檔案中 import React, { useContext } from'react'; import { MyContext } from './App'; function Child() { const { count, setCount } = useContext(MyContext); return ( <div> <h2>Child Component</h2> <h3>Count: {count}</h3> <button onClick={() => setCount(count - 1)}>Decrement</button> </div> ); }

useMemo() 記憶鉤子(值)

useMemo是React中的一個hook,用于優化組件的性能,它的作用是快取函式的回傳值,只有當依賴項發生變化時才重新計算,這樣可以避免在每次渲染時都重新計算函式的回傳值,從而提高組件的性能,

const memoizedValue = https://www.cnblogs.com/SpicyPeper/archive/2023/05/22/useMemo(() => computeExpensiveValue(a, b), [a, b]);

// 第一個引數是一個回呼函式,用于計算需要快取的值
// 第二個引數是一個陣列,用于指定依賴項,只有當依賴項發生變化時,才會重新計算memoizedValue的值,

import React, { useState, useMemo } from 'react';

function MyComponent() {
  const { a, setA } = useState(1);
  const result = useMemo(() => {
    // 只有當a發生變化時才會重新計算,這樣可以避免在每次其他渲染時都重新計算結果,提高組件的性能
    return a * 2;
  }, [a]);

  const add = () => {
    setA(a + 1)
  }

  return (
    <div>
      <div>{result}</div>
      <button onClick={() => add()}>a+1</button>
    </div>
  );
}

useCallback() 記憶鉤子(函式)

useCallback是React中的一個Hook函式,用于優化函陣列件的性能,它的作用是回傳一個記憶化的回呼函式,當依賴項發生變化時才會重新生成新的回呼函式,這樣可以避免在每次渲染時都創建新的回呼函式,從而提高組件的性能,

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

// 第一個引數是回呼函式
// 第二個引數是依賴項陣列,當依賴項陣列中的任意一個值發生變化時,useCallback會重新生成新的回呼函式,如果依賴項陣列為空,則每次渲染都會回傳同一個回呼函式,


// 需要注意的是,useCallback回傳的是一個記憶化的回呼函式,而不是一個普通的函式,因此,如果需要在組件外部使用該回呼函式,需要將其作為props傳遞給子組件,

// 舉例:使用useCallback優化組件性能

import React, { useState, useCallback } from 'react';

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

  // 普通的回呼函式
  const handleClick = () => {
    setCount(count + 1);
  };

  // 使用useCallback優化的回呼函式
  const handleClickMemoized = useCallback(() => {
    setCount(count + 1);
  }, [count]);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={handleClick}>普通的回呼函式</button>
      <button onClick={handleClickMemoized}>使用useCallback優化的回呼函式</button>
    </div>
  );
}

export default MyComponent;

useReducer() 行為鉤子

useReducer是React中一個狀態管理的Hooks,用于處理復雜的組件狀態邏輯,它和useState類似,都是用于管理組件狀態的,但是useReducer可以更好地處理復雜的狀態邏輯,尤其是在多個狀態相互影響的情況下會更加方便和清晰,


// 1. 定義初始狀態(initial state)和reducer函式,reducer函式的作用是根據當前的狀態和操作型別(action)來回傳新的狀態值,

const initialState = {
  count: 0,
};

function reducer(state, action) {
  switch (action.type) {
    case 'ADD':
      return { count: state.count + 1 };
    case 'SUB':
      return { count: state.count - 1 };
    default:
      throw new Error();
  }
}


// 2. 在組件中使用useReducer Hook,傳入reducer函式和initial state引數,獲取當前的state值和dispatch函式,

import React, { useReducer } from 'react';

function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <div>
      <h2>Counter: {state.count}</h2>
      <button onClick={() => dispatch({ type: 'ADD' })}>+</button>
      <button onClick={() => dispatch({ type: 'SUB' })}>-</button>
    </div>
  );
}

useRef() 保存參考值

useRef是React中的一個hook,用于創建一個可變的參考,類似于在類組件中使用的this.refs,與useState不同,useRef回傳一個可變的值,而不會觸發重新渲染組件,

useRef可以用于保存任何可變值,例如DOM元素的參考、定時器的識別符號、上一個渲染周期的狀態等,它還提供了一個.current屬性來訪問保存的值,

使用場景

  1. 獲取DOM元素的參考

  2. 保存上一個渲染周期的狀態

  3. 在useEffect中訪問最新的props和state值

  4. 保存定時器的識別符號,以便在組件卸載時清除


// useRef創建的ref物件與組件生命周期不相關,因此它不會在呼叫setState或props更新時自動更新,ref改變取決于使用它的具體方式

const ref = useRef()

// 因為hooks重新渲染其實是組件的自呼叫,所以我們不能在組件中直接定義一個值,let a = 1 或 const arr = []都是錯誤的,此時我們使用useRef來保存和訪問持久性資料

useImperativeHandle()

useImperativeHandle是React Hook中的一個函式,用于在使用ref時,向父組件暴露子組件的方法或屬性,它可以覆寫默認情況下通過ref自動公開該組件實體的方式,從而更加精準的控制哪些內容公開給父組件,

useImperativeHandle接受兩個引數:ref物件和一個callback函式,callback函式應該回傳包含想要掛載到ref上的任何公共方法或屬性的物件,當父組件從ref呼叫該方法或訪問該屬性時,callback函式定義的邏輯將被執行,


// 1. 在子組件中使用forwardRef高階組件轉發ref,以在父組件中獲得對子組件的參考,

import React, { forwardRef } from 'react';

const Child = forwardRef((props, ref) => {
  // 組件...
});


// 2. 使用useImperativeHandle Hook,將可供父組件訪問的方法或屬性包裝在一個callback函式中,并將該函式作為useImperativeHandle的第二個引數傳遞

import React, { forwardRef, useImperativeHandle } from 'react';

const Child = forwardRef((props, ref) => {
  const someMethod = () => {
    console.log('Hello from the child component');
  };

  useImperativeHandle(ref, () => ({
    someMethod,
  }));

  return <div>...</div>;
});

export default Child;


// 3. 在父組件中使用ref來呼叫從子組件暴露的方法

import React, { useRef } from 'react';
import Child from './Child';

function Parent() {
  const childRef = useRef(null);

  const handleClick = () => {
    // 呼叫子組件中公開的 someMethod 方法
    childRef.current.someMethod();
  };

  return (
    <div>
      <button onClick={handleClick}>呼叫子組件方法</button>
      <Child ref={childRef} />
    </div>
  );
}

其他

Immutable Data(不可變資料)

解決的問題

在 js 中,物件都是參考型別,在按參考傳遞資料的場景中,會存在多個變數指向同一個記憶體地址的情況,如果有多個代碼塊同時更改這個參考,就會產生競態

實作的原理

Persistent Data Structure(持久化資料結構):用一種資料結構來保存資料,當資料被修改時,會回傳一個物件,但是新的物件會盡可能的利用之前的資料結構而不會對記憶體造成浪費,也就是使用舊資料創建新資料時,要保證舊資料同時可用且不變,同時為了避免 deepCopy把所有節點都復制一遍帶來的性能損耗,Immutable 使用了 Structural Sharing(結構共享)

redux / flux

// redux / flux 要求采用回傳新物件的形式,來觸發資料更新、re-render,一般推薦的做法就是采用物件解構的方式,如果 state 物件巨大(注意:物件巨大),在結構、拷貝 state 的程序中,耗時會較長,

return {
  ...state,
  settings: {
    ...state.settings,
    profile:{
      ...state.settings.profile,
      darkmode: true,
    }
  }
}

immer

immer中文網址


// 開源庫實作思路:原始物件先做了一層 Proxy 代理,得到 draftState 傳遞給 function,function(帶副作用) 直接更改 draftState,最后 produce 回傳新的物件

// 安裝
npm install immer

//使用
import React, { useState } from "react";
import produce from "immer";


export default function App() {
  const [list, setList] = useState([1, 2, 3]);

  const addMutable = () => {
    list.push("新資料");
    setList(list);
  };

  const addImmutable = () => {
    /**
     * 第一個引數是要代理的資料
     * 第二個引數是一個函式
     */
    const newVal = produce(list, draft => {
      /**
       * draft 相當于 list
       * 在這個方法里面,可以直接修改draft,注意draft也只能在這個方法里面修改
       * 不需要回傳值,immer內部已經幫我處理好了
       */
      draft.push('新資料')
    })
    console.log(newVal)
    setList(newVal);
  };

  return (
    <div className="App">
      <button onClick={addMutable}>已可變的方式添加</button>
      <button onClick={addImmutable}>已不可變的方式添加</button>
      {list.map((item, index) => (<li key={index}>{item}</li>))}
    </div>
  );
}

函陣列件傳值

hooks直接通過props傳值

//父組件中在子組件標簽上定義屬性
import 子組件
<Son 屬性={值}></Son>

// 子組件接收父組件中傳遞屬性
props.屬性
父傳子

// 父組件
import { useState } from 'react'
import Son from './son'

function Father() {


  const [data, setData] = useState(0)

  return (
    <div>
      <Son
      {/*通過定義屬性傳值*/}
      name = 'bob' d = {data}
      ></Son>
      <button onClick={() => setData(data + 1)}>+1</button>
    </div>
  )

}

export default Father


// 子組件
import { useState } from 'react'


function Son (props) {

  return (
    <div>
      <div>{props.name}</div>
      <div>{props.d}</div>
    </div>
  )
}



export default Son

子傳父

// 父組件
import { useState } from 'react'
import Son from './son'

function Father() {


  const [data, setData] = useState(0)

  const getSon = (msg) => {
    console.log(msg)
  }

  return (
    <div>
      <Son
      {/*定義一個方法用于接收子組件傳值*/}
      name = 'bob' d = {data} giveFather={(msg) => getSon(msg)}
      ></Son>
      <button onClick={() => setData(data + 1)}>+1</button>
    </div>
  )

}



export default Father


// 子組件
import { useState } from 'react'


function Son (props) {

  // 接收父組件方法 通過此方法傳值給父組件
  const set = () => {
    props.giveFather('兒子給父親的')
  }


  return (
    <div>
      <div>{props.name}</div>
      <div>{props.d}</div>
      <button onClick={set}>給父親</button>
    </div>
  )
}



export default Son

React.memo

一個高階組件,用于優化React組件的性能,它可以幫助我們避免不必要的渲染,從而提高應用程式的性能,當組件的props沒有改變時,React.memo會使用之前的渲染結果,而不會重新渲染組件,這對于那些渲染開銷較大的組件特別有用,

import React from 'react';

const MyComponent = React.memo(props => {
  // 組件代碼
}, (prevProps, currentProps) => {
  
  // prevProps 上次props
  // currentProps 當前props

  return Boolean;
  // false 渲染
  // true 不渲染
});

// 在上面的代碼中,我們將一個函陣列件傳遞給React.memo(),并將其回傳的新組件賦值給MyComponent,現在,MyComponent將只在其props發生更改時重新渲染,

// 需要注意的是,React.memo()僅檢查props的淺層比較,如果props包含復雜的物件或函式,可能需要手動實作更深層次的比較,
import React, { useState } from "react";

// 子組件
const SonMemo = React.memo(
  // 第一個引數 接收一個hook
  (props) => {
    return (
      <div>{props.data}</div>
    )
    // 第二個引數 接收一個函式
  }, (prevProps, currentProps) => {
    // 偶數不渲染
    // 奇數渲染
    return currentProps.data % 2 === 0
  }
)


function FatherMemo () {

  const [num, setNum] = useState(0)

  return (
    <div>
      <h1>{num}</h1>
      {/*點擊加一*/}
      <button onClick={() => setNum(num + 1)}>按鈕</button>
      <SonMemo data=https://www.cnblogs.com/SpicyPeper/archive/2023/05/22/{num}>
    
) } export default FatherMemo;

React hooks中的過期閉包問題

什么是閉包

過期閉包概念

過期閉包(stale closure)是指一個閉包在創建之后,所參考的外部作用域內的變數已經被修改,但閉包內仍然保存了舊值,這就導致閉包中的代碼與外部作用域內的實際狀態不一致,從而造成錯誤的結果,

useEffect中過期閉包體現和解決

// react hook中useEffect的過期閉包
import { useEffect, useState } from "react"


function ExpiredClosure () {

  const [num, setNum] = useState(0)

  useEffect(
    () => {
      setInterval(() => {
        // 這里的num在初始化useEffect執行時取到0之后 因為閉包num值不會自動更新
        console.log(num)
      }, 2000)
    }, []
  )

return (
  <div>
    <h1>{num}</h1>
    <button onClick={() => setNum(num + 1)}>+1</button>
  </div>
)

}


export default ExpiredClosure


// 解決react hook中useEffect過期閉包問題
import { useEffect, useState } from "react"


function ExpiredClosure () {

  const [num, setNum] = useState(0)

  useEffect(
    () => {
      const timer = setInterval(() => {
        console.log(num)
      }, 2000)
      return () => {
        // 當組件卸載時 清除計時器
        clearInterval(timer)
      }
      // 添加num為依賴項
    }, [num]
  )

return (
  <div>
    <h1>{num}</h1>
    <button onClick={() => setNum(num + 1)}>+1</button>
  </div>
)

}


export default ExpiredClosure

useState中過期閉包體現和解決

// react hook中useState的過期閉包
import { useState } from "react";


function ExpiredClosure2 () {

  const [num, setNum] = useState(0)


  // 點擊正常+1
  const add = () => {
    setNum(num + 1)
  }
  
  // 假設點擊時num為3 兩秒+2 = 5 在兩秒之間不管點擊多少次+1操作num變為678910...最后num都為5
  const add2 = () => {
    setTimeout(() => {
      setNum(num + 2)
    }, 2000)
  }

  // 當我們點擊+2時候會取得當前值 之后點擊其他改變num值 +2中的num都不會隨之改變 兩秒后取得的num+2給setNum后 渲染頁面

  return (
    <div>
      <h1>{num}</h1>
      <button onClick={add}>+1</button><br />
      <button onClick={add2}>+2</button>
    </div>
  )

}


export default ExpiredClosure2;


// 解決react hook中useState過期閉包問題
import { useState } from "react";


function ExpiredClosure2 () {

  const [num, setNum] = useState(0)



  const add = () => {
    setNum(num + 1)
  }

  const add2 = () => {
    setTimeout(() => {
      // setNum中可以傳入一個函式 這個函式接收一個引數 用于獲取當前num值
      setNum((currentNum) => currentNum + 2)
    }, 2000)
  }

  return (
    <div>
      <h1>{num}</h1>
      <button onClick={add}>+1</button><br />
      <button onClick={add2}>+2</button>
    </div>
  )

}


export default ExpiredClosure2;

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/553121.html

標籤:其他

上一篇:記錄--九個超級好用的 Javascript 技巧

下一篇:返回列表

標籤雲
其他(159505) Python(38162) JavaScript(25443) Java(18096) C(15230) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7204) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4574) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1975) 功能(1967) Web開發(1951) HtmlCss(1940) C++(1919) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • React筆記-Hooks(九)

    # React筆記-Hooks(九) ## Hooks ### 概念 >React Hooks 的意思是 組件盡量寫成純函式 如果需要外部功能和副作用 就用鉤子把外部代碼"鉤"進來 ### 函陣列件和類組件區別 >- 函陣列件沒有狀態(state) 類組件有 >- 函陣列件沒有生命周期 類組件有(掛 ......

    uj5u.com 2023-05-23 09:12:25 more
  • 記錄--九個超級好用的 Javascript 技巧

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 在實際的開發作業程序中,積累了一些常見又超級好用的 Javascript 技巧和代碼片段,包括整理的其他大神的 JS 使用技巧,今天篩選了 9 個,以供大家參考。 1、動態加載 JS 檔案 在一些特殊的場景下,特別是一些庫和框架的開 ......

    uj5u.com 2023-05-23 09:12:15 more
  • HTTP1.0、HTTP1.1、HTTP2.0 協議的區別

    HTTP 1.1相比HTTP 1.0具有以下優點: 1. 持久連接 :HTTP 1.1引入了持久連接機制,允許多個請求和回應復用同一個TCP連接。這樣可以減少建立和關閉連接的開銷,提高性能和效率。2. 流水線處理 :HTTP 1.1支持流水線處理,即可以同時發送多個請求,不需要等待前一個請求的回應。 ......

    uj5u.com 2023-05-23 09:12:09 more
  • 使用 React Three Fiber 和 GSAP 實作 WebGL 輪播影片

    參考:[Building a WebGL Carousel with React Three Fiber and GSAP](https://tympanus.net/codrops/2023/04/27/building-a-webgl-carousel-with-react-three-fibe ......

    uj5u.com 2023-05-23 09:12:04 more
  • 記錄--九個超級好用的 Javascript 技巧

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 在實際的開發作業程序中,積累了一些常見又超級好用的 Javascript 技巧和代碼片段,包括整理的其他大神的 JS 使用技巧,今天篩選了 9 個,以供大家參考。 1、動態加載 JS 檔案 在一些特殊的場景下,特別是一些庫和框架的開 ......

    uj5u.com 2023-05-23 09:11:49 more
  • HTTP1.0、HTTP1.1、HTTP2.0 協議的區別

    HTTP 1.1相比HTTP 1.0具有以下優點: 1. 持久連接 :HTTP 1.1引入了持久連接機制,允許多個請求和回應復用同一個TCP連接。這樣可以減少建立和關閉連接的開銷,提高性能和效率。2. 流水線處理 :HTTP 1.1支持流水線處理,即可以同時發送多個請求,不需要等待前一個請求的回應。 ......

    uj5u.com 2023-05-23 09:11:43 more
  • 學系統集成專案管理工程師(中項)系列24b_資訊系統集成專業技術知識

    ![](https://img2023.cnblogs.com/blog/3076680/202305/3076680-20230510153704868-941917377.png) # 1. 面向物件系統分析與設計 ## 1.1. 基本概念 ### 1.1.1. 物件 #### 1.1.1.1. ......

    uj5u.com 2023-05-23 09:11:00 more
  • 學系統集成專案管理工程師(中項)系列24b_資訊系統集成專業技術知識

    ![](https://img2023.cnblogs.com/blog/3076680/202305/3076680-20230510153704868-941917377.png) # 1. 面向物件系統分析與設計 ## 1.1. 基本概念 ### 1.1.1. 物件 #### 1.1.1.1. ......

    uj5u.com 2023-05-23 09:10:25 more
  • 學系統集成專案管理工程師(中項)系列24a_資訊系統集成專業技術知識

    ![](https://img2023.cnblogs.com/blog/3076680/202305/3076680-20230510152925684-2098118079.png) # 1. 資訊系統的生命周期 ## 1.1. 【19下選10】 ## 1.2. 立項 ### 1.2.1. 形成 ......

    uj5u.com 2023-05-22 07:58:31 more
  • 學系統集成專案管理工程師(中項)系列24a_資訊系統集成專業技術知識

    ![](https://img2023.cnblogs.com/blog/3076680/202305/3076680-20230510152925684-2098118079.png) # 1. 資訊系統的生命周期 ## 1.1. 【19下選10】 ## 1.2. 立項 ### 1.2.1. 形成 ......

    uj5u.com 2023-05-22 07:52:46 more