主頁 > 企業開發 > 基于 React 實作一個 Transition 過渡影片組件

基于 React 實作一個 Transition 過渡影片組件

2020-10-02 02:16:55 企業開發

過渡影片使 UI 更富有表現力并且易于使用,如何使用 React 快速的實作一個 Transition 過渡影片組件?

基本實作

實作一個基礎的 CSS 過渡影片組件,通過切換 CSS 樣式實作簡單的影片效果,也就是通過添加或移除某個 class 樣式,因此需要給 Transition 組件添加一個 toggleClass 屬性,標識要切換的 class 樣式,再添加一個 action 屬性實作樣式切換,action 為 true 時添加 toggleClass 到影片元素上,action 為 false 時移除 toggleClass,

安裝 classnames 插件:

npm install classnames --save-dev

classnames 是一個簡單的JavaScript實用程式,用于有條件地將 className 連接在一起,

在 components 目錄下新建一個 Transition 檔案夾,并在該檔案夾下新建一個 Transition.jsx 檔案:

import React from 'react'
import classnames from 'classnames'

/**
 * css過渡影片組件
 *
 * @visibleName Transition 過渡影片
 */
class Transition extends React.Component {
  render() {
    const { children } = this.props
    const transition = (
      <div
        className={
          classnames({
            transition: true
          })
        }
        style={
          {
            position: 'relative',
            overflow: 'hidden'
          }
        }
      >
        <div
          className={
            classnames({
              'transition-wrapper': true
            })
          }
        >
          { children }
        </div>
      </div>
    )
    return transition
  }
}

export default Transition

這里使用了 JSX,在 JSX 中,使用 camelCase(小駝峰命名)來定義屬性的名稱,使用大括號“{}”嵌入任何有效的 JavaScript 運算式,
如:

const name = 'Josh Perez';
const element = <h1>Hello, {name}</h1>;

等價于:

const element = <h1>Hello, Josh Perez</h1>;

注意:
因為 JSX 語法上更接近 JavaScript 而不是 HTML,所以 React DOM 使用 camelCase(小駝峰命名)來定義屬性的名稱,而不使用 HTML 屬性名稱的命名約定,
例如,JSX 里的 class 變成了 className,而 tabindex 則變為 tabIndex,

另外,在 React 中,props.children
包含組件所有的子節點,即組件的開始標簽和結束標簽之間的內容(與 Vue 中 slot 插槽相似),例如:

<Button>默認按鈕</Button>

在 Button 組件中獲取 props.children,就可以得到字串“默認按鈕”,

接下來,在 Transition 檔案夾下新建一個 index.js,匯出 Transition 組件:

import Transition from './Transition.jsx'

export { Transition }

export default Transition

然后,在 Transition.jsx 檔案中為組件添加 props 檢查并設定 action 的默認值:

import PropTypes from 'prop-types'

const propTypes = {
  /** 執行影片 */
  action: PropTypes.bool,
  /** 切換的css影片的class名稱 */
  toggleClass: PropTypes.string
}

const defaultProps = {
  action: false
}

這里使用了 prop-types 實作運行時型別檢查,

注意:
prop-types 是一個運行時型別檢查工具,也是 create-react-app 腳手架默認配置的運行時型別檢查工具,使用時直接引入即可,無需安裝,

完整的 Transition 組件代碼如下:

import React from 'react'
import PropTypes from 'prop-types'
import classnames from 'classnames'

const propTypes = {
  /** 執行影片 */
  action: PropTypes.bool,
  /** 切換的css影片的class名稱 */
  toggleClass: PropTypes.string
}

const defaultProps = {
  action: false
}

/**
 * css過渡影片組件
 *
 * @visibleName Transition 過渡影片
 */
class Transition extends React.Component {

  static propTypes = propTypes

  static defaultProps = defaultProps

  render() {
    const {
      className,
      action,
      toggleClass,
      children
    } = this.props
    const transition = (
      <div
        className={
          classnames({
            transition: true
          })
        }
        style={
          {
            position: 'relative',
            overflow: 'hidden'
          }
        }
      >
        <div
          className={
            classnames({
              'transition-wrapper': true,
              [className]: className,
              [toggleClass]: action && toggleClass
            })
          }
        >
          { children }
        </div>
      </div>
    )
    return transition
  }
}

export default Transition

現在,可以使用我們的 Transition 組件了,

CSS 代碼如下:

.fade {
  transition: opacity 0.15s linear;
}

.fade:not(.show) {
  opacity: 0;
}

JS 代碼如下:

import React from 'react';
import Transition from './Transition';

class Anime extends React.Component {
  constructor (props) {
    super(props)
    this.state = {
      action: true
    }
  }
  
  render () {
    const btnText = this.state.action ? '淡出' : '淡入'
    return (
      <div>
        <Transition
          className="fade"
          toggle
          action={ this.state.action }
        >
          淡入淡出
        </Transition>
        <button
          style={{ marginTop: '20px' }}
          onClick={() => this.setState({ action: !this.state.action })}
        >
          { btnText }
        </button>
      </div>
    )
  }
}

然后,在你需要該影片的地方使用 Anime 組件即可,

實作 Animate.css 兼容

Animate.css 是一款強大的預設 CSS3 影片庫,接下來,實作在 Transition 組件中使用 Animate.css 實作強大的 CSS3 影片,

由于 Animate.css 影片在進入影片和離開影片通常使用兩個效果相反的 class 樣式,因此,需要給 Transition 組件添加 enterClass 和 leaveClass 兩個屬性,實作影片切換,

import React from 'react'
import PropTypes from 'prop-types'
import classnames from 'classnames'

const propTypes = {
  /** 執行影片 */
  action: PropTypes.bool,
  /** 切換的css影片的class名稱 */
  toggleClass: PropTypes.string,
  /** 進入影片的class名稱,存在 toggleClass 時無效 */
  enterClass: PropTypes.string,
  /** 離開影片的class名稱,存在 toggleClass 時無效 */
  leaveClass: PropTypes.string
}

const defaultProps = {
  action: false
}

/**
 * css過渡影片組件
 *
 * @visibleName Transition 過渡影片
 */
class Transition extends React.Component {

  static propTypes = propTypes

  static defaultProps = defaultProps

  render() {
    const {
      className,
      action,
      toggleClass,
      enterClass,
      leaveClass,
      children
    } = this.props
    return (
      <div
        className={
          classnames({
            transition: true
          })
        }
        style={
          {
            position: 'relative',
            overflow: 'hidden'
          }
        }
      >
        <div
          className={
            classnames({
              'transition-wrapper': true,
              [className]: className,
              [toggleClass]: action && toggleClass,
              [enterClass]: !toggleClass && action && enterClass,
              [leaveClass]: !toggleClass && !action && leaveClass,
            })
          }
        >
          { children }
        </div>
      </div>
    )
  }
}

export default Transition

注意:
由于 toggleClass 適用于那些進入影片與離開影片切換相同 class 樣式的情況,而 enterClass 和 leaveClass 適用于那些進入影片與離開影片切換不同的 class 樣式的情況,所以,他們與 toggleClass 不能共存,

接下來,就可以試一試加入 Animate.css 后的 Transition 組件:

import React from 'react';
import 'animate.css';

class Anime extends React.Component {
  constructor (props) {
    super(props)
    this.state = {
      action: true
    }
  }
  
  render () {
    return (
      <div>
        <Transition
          className="animated"
          enter
          leave
          action={ this.state.action }
        >
          彈入彈出
        </Transition>
        <utton
          style={{ marginTop: '20px' }}
          onClick={() => this.setState({ action: !this.state.action })}
        >
          { this.state.action ? '彈出' : '彈入' }
        </utton>
      </div>
    )
  }
}

功能擴展

通過上面的實作,Transition 組件能適用大部分場景,但是功能不夠豐富,因此,接下來就需要擴展 Transition 的介面,影片通常可以設定延遲時間,播放時長,播放次數等屬性,因此,需要給 Transition 添加這些屬性,來豐富設定影片,

添加如下 props 屬性,并設定默認值:

const propTypes = {
  ...,
  /** 影片延遲執行時間 */
  delay: PropTypes.string,
  /** 影片執行時間長度 */
  duration: PropTypes.string,
  /** 影片執行次數,只在執行 CSS3 影片時有效 */
  count: PropTypes.number,
  /** 影片緩動函式 */
  easing: PropTypes.oneOf([
    'linear',
    'ease',
    'ease-in',
    'ease-out',
    'ease-in-out'
  ]),
  /** 是否強制輪流反向播放影片,count 為 1 時無效 */
  reverse: PropTypes.bool
}

const defaultProps = {
  count: 1,
  reverse: false
}

根據 props 設定樣式:

// 影片樣式
const styleText = (() => {
  let style = {}
  // 設定延遲時長
  if (delay) {
    style.transitionDelay = delay
    style.animationDelay = delay
  }
  // 設定播放時長
  if (duration) {
    style.transitionDuration = duration
    style.animationDuration = duration
  }
  // 設定播放次數
  if (count) {
    style.animationIterationCount = count
  }
  // 設定緩動函式
  if (easing) {
    style.transitionTimingFunction = easing
    style.animationTimingFunction = easing
  }
  // 設定影片方向
  if (reverse) {
    style.animationDirection = 'alternate'
  }
  return style
})()

完整代碼如下:

import React from 'react'
import PropTypes from 'prop-types'
import classnames from 'classnames'

const propTypes = {
  /** 執行影片 */
  action: PropTypes.bool,
  /** 切換的css影片的class名稱 */
  toggleClass: PropTypes.string,
  /** 進入影片的class名稱,存在 toggleClass 時無效 */
  enterClass: PropTypes.string,
  /** 離開影片的class名稱,存在 toggleClass 時無效 */
  leaveClass: PropTypes.string,
  /** 影片延遲執行時間 */
  delay: PropTypes.string,
  /** 影片執行時間長度 */
  duration: PropTypes.string,
  /** 影片執行次數,只在執行 CSS3 影片時有效 */
  count: PropTypes.number,
  /** 影片緩動函式 */
  easing: PropTypes.oneOf([
    'linear',
    'ease',
    'ease-in',
    'ease-out',
    'ease-in-out'
  ]),
  /** 是否強制輪流反向播放影片,count 為 1 時無效 */
  reverse: PropTypes.bool
}

const defaultProps = {
  action: false,
  count: 1,
  reverse: false
}

/**
 * css過渡影片組件
 *
 * @visibleName Transition 過渡影片
 */
class Transition extends React.Component {

  static propTypes = propTypes

  static defaultProps = defaultProps

  render() {
    const {
      className,
      action,
      toggleClass,
      enterClass,
      leaveClass,
      delay,
      duration,
      count,
      easing,
      reverse,
      children
    } = this.props

    // 影片樣式
    const styleText = (() => {
      let style = {}
      // 設定延遲時長
      if (delay) {
        style.transitionDelay = delay
        style.animationDelay = delay
      }
      // 設定播放時長
      if (duration) {
        style.transitionDuration = duration
        style.animationDuration = duration
      }
      // 設定播放次數
      if (count) {
        style.animationIterationCount = count
      }
      // 設定緩動函式
      if (easing) {
        style.transitionTimingFunction = easing
        style.animationTimingFunction = easing
      }
      // 設定影片方向
      if (reverse) {
        style.animationDirection = 'alternate'
      }
      return style
    })()

    return (
      <div
        className={
          classnames({
            transition: true
          })
        }
        style={
          {
            position: 'relative',
            overflow: 'hidden'
          }
        }
      >
        <div
          className={
            classnames({
              'transition-wrapper': true,
              [className]: className,
              [toggleClass]: action && toggleClass,
              [enterClass]: !toggleClass && action && enterClass,
              [leaveClass]: !toggleClass && !action && leaveClass,
            })
          }
          style={ styleText }
        >
          { children }
        </div>
      </div>
    )
  }
}

export default Transition

這里為 Transition 增加了以下設定屬性:

  • delay:規定在影片開始之前的延遲,
  • duration:規定完成影片所花費的時間,以秒或毫秒計,
  • count:規定影片應該播放的次數,
  • easing:規定影片的速度曲線,
  • reverse:規定是否應該輪流反向播放影片,

目前,Transition 的功能已經相當豐富,可以很精細的控制 CSS3 影片,

優化

這一步,我們需要針對 Transition 組件進一步優化,主要包括影片結束的監聽、卸載組件以及兼容,

添加以下 props 屬性,并設定默認值:

const propTypes = {
  ...,
  /** 影片結束的回呼 */
  onEnd: PropTypes.func,
  /** 離開影片結束時卸載元素 */
  exist: PropTypes.bool
}

const defaultProps = {
  ...,
  reverse: false,
  exist: false
}

處理影片結束的監聽事件:

/**
 * css過渡影片組件
 *
 * @visibleName Transition 過渡影片
 */
class Transition extends React.Component {

  ...

  onEnd = e => {
    const { onEnd, action, exist } = this.props
    if (onEnd) {
      onEnd(e)
    }
    // 卸載 DOM 元素
    if (!action && exist) {
      const node = e.target.parentNode
      node.parentNode.removeChild(node)
    }
  }

  /**
   * 對影片結束事件 onEnd 回呼的處理函式
   *
   * @param {string} type - 事件解系結型別: add - 系結事件,remove - 移除事件系結
   */
  handleEndListener (type = 'add') {
    const el = ReactDOM.findDOMNode(this).querySelector('.transition-wrapper')
    const events = ['animationend', 'transitionend']
    events.forEach(ev => {
      el[`${type}EventListener`](ev, this.onEnd, false)
    })
  }

  componentDidMount () {
    this.handleEndListener()
  }

  componentWillUnmount () {
    const { action, exist } = this.props
    if (!action && exist) {
      this.handleEndListener('remove')
    }
  }

  render () {
    ...
  }
}

這里使用到兩個生命周期函式 componentDidMount 和 componentWillUnmount,關于 React 生命周期的介紹請移步組件生命周期,

react-dom 提供了可在 React 應用中使用的 DOM 方法,

獲取兼容性的 animationend 事件和 transitionend 事件,不同的瀏覽器要求使用不同的前綴,因為火狐和IE都已經支持了這兩個事件,因此,只需針對 webkit 內核瀏覽器進行兼容的 webkitTransitionEnd 事件檢測,檢測函式代碼如下:

/**
 * 瀏覽器兼容事件檢測函式
 *
 * @param {node} el - 觸發事件的 DOM 元素
 * @param {array} events - 可能的事件型別
 * @returns {*}
 */
const whichEvent = (el, events) => {
  const len = events.length
  for (var i = 0; i < len; i++) {
    if (el.style[i]) {
      return events[i];
    }
  }
}

修改 handleEndListener 函式:

/**
 * css過渡影片組件
 *
 * @visibleName Transition 過渡影片
 */
class Transition extends React.Component {

  ...

  /**
   * 對影片結束事件 onEnd 回呼的處理函式
   *
   * @param {string} type - 事件解系結型別: add - 系結事件,remove - 移除事件系結
   */
  handleEndListener (type = 'add') {
    const el = ReactDOM.findDOMNode(this).querySelector('.transition-wrapper')
    const events = ['AnimationEnd', 'TransitionEnd']
    events.forEach(ev => {
      const eventType = whichEvent(el, [ev.toLowerCase(), `webkit${ev}`])
      el[`${type}EventListener`](eventType, this.onEnd, false)
    })
  }

  ...

}

到這里,我們完成了整個 Transition 組件的開發,完整代碼如下:

import React from 'react'
import PropTypes from 'prop-types'
import classnames from 'classnames'
import ReactDOM from 'react-dom'

const propTypes = {
  /** 執行影片 */
  action: PropTypes.bool,
  /** 切換的css影片的class名稱 */
  toggleClass: PropTypes.string,
  /** 進入影片的class名稱,存在 toggleClass 時無效 */
  enterClass: PropTypes.string,
  /** 離開影片的class名稱,存在 toggleClass 時無效 */
  leaveClass: PropTypes.string,
  /** 影片延遲執行時間 */
  delay: PropTypes.string,
  /** 影片執行時間長度 */
  duration: PropTypes.string,
  /** 影片執行次數,只在執行 CSS3 影片時有效 */
  count: PropTypes.number,
  /** 影片緩動函式 */
  easing: PropTypes.oneOf([
    'linear',
    'ease',
    'ease-in',
    'ease-out',
    'ease-in-out'
  ]),
  /** 是否強制輪流反向播放影片,count 為 1 時無效 */
  reverse: PropTypes.bool,
  /** 影片結束的回呼 */
  onEnd: PropTypes.func,
  /** 離開影片結束時卸載元素 */
  exist: PropTypes.bool
}

const defaultProps = {
  action: false,
  count: 1,
  reverse: false,
  exist: false
}

/**
 * 瀏覽器兼容事件檢測函式
 *
 * @param {node} el - 觸發事件的 DOM 元素
 * @param {array} events - 可能的事件型別
 * @returns {*}
 */
const whichEvent = (el, events) => {
  const len = events.length
  for (var i = 0; i < len; i++) {
    if (el.style[i]) {
      return events[i];
    }
  }
}

/**
 * css過渡影片組件
 *
 * @visibleName Transition 過渡影片
 */
class Transition extends React.Component {

  static propTypes = propTypes

  static defaultProps = defaultProps

  onEnd = e => {
    const { onEnd, action, exist } = this.props
    if (onEnd) {
      onEnd(e)
    }
    // 卸載 DOM 元素
    if (!action && exist) {
      const node = e.target.parentNode
      node.parentNode.removeChild(node)
    }
  }

  /**
   * 對影片結束事件 onEnd 回呼的處理函式
   *
   * @param {string} type - 事件解系結型別: add - 系結事件,remove - 移除事件系結
   */
  handleEndListener (type = 'add') {
    const el = ReactDOM.findDOMNode(this).querySelector('.transition-wrapper')
    const events = ['AnimationEnd', 'TransitionEnd']
    events.forEach(ev => {
      const eventType = whichEvent(el, [ev.toLowerCase(), `webkit${ev}`])
      el[`${type}EventListener`](eventType, this.onEnd, false)
    })
  }

  componentDidMount () {
    this.handleEndListener()
  }

  componentWillUnmount() {
    const { action, exist } = this.props
    if (!action && exist) {
      this.handleEndListener('remove')
    }
  }

  render () {
    const {
      className,
      action,
      toggleClass,
      enterClass,
      leaveClass,
      delay,
      duration,
      count,
      easing,
      reverse,
      children
    } = this.props

    // 影片樣式
    const styleText = (() => {
      let style = {}
      // 設定延遲時長
      if (delay) {
        style.transitionDelay = delay
        style.animationDelay = delay
      }
      // 設定播放時長
      if (duration) {
        style.transitionDuration = duration
        style.animationDuration = duration
      }
      // 設定播放次數
      if (count) {
        style.animationIterationCount = count
      }
      // 設定緩動函式
      if (easing) {
        style.transitionTimingFunction = easing
        style.animationTimingFunction = easing
      }
      // 設定影片方向
      if (reverse) {
        style.animationDirection = 'alternate'
      }
      return style
    })()

    const transition = (
      <div
        className={
          classnames({
            transition: true
          })
        }
        style={
          {
            position: 'relative',
            overflow: 'hidden'
          }
        }
      >
        <div
          className={
            classnames({
              'transition-wrapper': true,
              [className]: className,
              [toggleClass]: action && toggleClass,
              [enterClass]: !toggleClass && action && enterClass,
              [leaveClass]: !toggleClass && !action && leaveClass,
            })
          }
          style={ styleText }
        >
          { children }
        </div>
      </div>
    )

    return transition
  }
}

export default Transition

原文地址:基于 React 實作一個 Transition 過渡影片組件

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

標籤:JavaScript

上一篇:ES6學習筆記(二):教你玩轉類的繼承和類的物件

下一篇:js事件委托

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(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
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more