React 全家桶-React基礎

来源:https://www.cnblogs.com/bwqueen/archive/2022/11/06/16863566.html
-Advertisement-
Play Games

React 全家桶-React基礎 用於構建用戶界面的JavaScript庫。 facebook開源、組件化、聲明式編碼、React Native移動端開發、虛擬DOM+Diffing演算法 官網:https://react.docschina.org/ 第一章:React的基本使用 1.相關js庫 ...


React 全家桶-React基礎

用於構建用戶界面的JavaScript庫

facebook開源組件化聲明式編碼React Native移動端開發虛擬DOM+Diffing演算法

官網:https://react.docschina.org/

第一章:React的基本使用

1.相關js庫

  • react.js:React核心庫
  • React-dom.js:提供操作DOM的react擴展庫
  • Babel.min.js:解析JSX語法代碼轉為JS代碼的庫
    • ES6轉ES5

2.創建虛擬DOM的兩種方式

  • JSX
  • JS

3.JSX

React定義的一種類似於XML的JS擴展語法:JS + XML

它最終產生的結果不是字元串,也不是HTML/XML標簽,而是一個JS對象

語法規則:

  • 標簽中混入JS表達式要用{}

    • 表達式:一個表達式會返回一個值,而代碼塊不一定有值返回

  • 樣式的類名指定不要用class屬性名,用className

  • 內聯樣式,要用style={{key: value}}的形式去寫

  • 只能有一個根標簽

  • 標簽必須閉合

  • JSX標簽轉換規則

    • 若小寫字母開頭,則將該標簽轉換為html中同名元素,若html中無該標簽對應的同名元素,則報錯
    • 若大寫開頭,則渲染對應的組件,若組件未曾定義,則報錯

4.模塊化與組件化

模塊:向外提供特定功能的js程式,一般是一個js文件

組件:實現局部功能效果的代碼和資源的集合

第二章:React面向組件編程

1.基本理解和使用

1.1 React開發者工具

React Developer Tools 瀏覽器插件

1.2 效果

函數式組件

<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <script type="text/babel">
        // 1. 創建函數式組件
        function Demo () {
            console.log(this) // 此處的this是undefined,因為babel編譯後開啟了嚴格模式
            return <h2>用函數定義的組件</h2>
        }

        // 2. 渲染組件到頁面
        ReactDOM.render(<Demo/>, document.getElementById('ctx'))
        /*
            渲染步驟:
            1. React解析組件標簽,找到了了Demo組件
            2. 發現組件是使用函數定義的。隨後調用該函數,將返回的虛擬DOM轉為真實DOM,隨後呈現在頁面上
        */
    </script>    
</body>

類式組件

<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <script type="text/babel">
        // 1. 創建類式組件
        class MyComponent extends React.Component {
            render () {
                console.log(this)
                return <h2>用類定義的組件,適用於複雜組件的定義</h2>
            }
        }
        ReactDOM.render(<MyComponent/>, document.getElementById('ctx'))
        /*
            渲染步驟:
            1. React解析組件標簽,找到了了 MyComponent 組件
            2. 發現組件是使用類定義的。隨後new出該類的實例,並通過該實例調用原型上的render方法,將返回的虛擬DOM轉為真實DOM,隨後呈現在頁面上
        */
    </script>    
</body>

2.組件三大核心屬性

2.1 state

<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <script type="text/babel">
        class Weather extends React.Component {
            state = {
                isHot: false
            }
            render () {
                const {isHot} = this.state
                return <h2 onClick={this.changeWeather}>天氣:{isHot ? '熱' : '涼' },風速:{isHot ? '一級' : '二級' }</h2>
            }
            // 自定義方法,要用賦值語句+箭頭函數(箭頭函數沒有自己的this)
            changeWeather = () => {
                this.state.isHot = !this.state.isHot
                this.setState(this.state)
            }
        }
        ReactDOM.render(<Weather/>, document.getElementById('ctx'))
    </script>    
</body>

2.2 props

類式組件使用props
<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <!-- 引入prop-types,用於對組件標簽進行限制 -->
    <script src="../js/prop-types.js" type="text/javascript"></script>
    <script type="text/babel">
        class Person extends React.Component {

            // 構造器是否接收props,是否傳遞給super?問題取決於:是否希望在構造器中通過this訪問props
            constructor(props) {
                super(props)
                console.log('c', this.props)
            }

            // 對標簽屬性進行類型、必要性的限制
            static propTypes = {
                name: PropTypes.string.isRequired
            }
            
            // 指定預設值
            static defaultProps = {
                sex: '未知'
            }

            render () {
                const {name, age, sex} = this.props
                return (
                    <ul>
                        <li>姓名:{name}</li>    
                        <li>性別:{sex}</li>    
                        <li>年齡:{age}</li>    
                    </ul>
                )
            }
        }
        
        
        const p = {name: '逾期', age: 18, sex: '女'}
        ReactDOM.render(<Person {...p}/>, document.getElementById('ctx'))
    </script>    
</body>
函數式組件使用props
<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <!-- 引入prop-types,用於對組件標簽進行限制 -->
    <script src="../js/prop-types.js" type="text/javascript"></script>
    <script type="text/babel">
        
        function Person (props) {
            const {name, sex, age} = props
            return (
                    <ul>
                        <li>姓名:{name}</li>    
                        <li>性別:{sex}</li>    
                        <li>年齡:{age}</li>    
                    </ul>
                )
        }

        // 對標簽屬性進行類型、必要性的限制
        Person.propTypes = {
            name: PropTypes.string.isRequired
        }
        
        // 指定預設值
        Person.defaultProps = {
            sex: '未知'
        }
        
        const p = {name: '逾期', age: 18, sex: '女'}
        ReactDOM.render(<Person {...p}/>, document.getElementById('ctx'))
    </script>    
</body>

2.3 refs與事件處理

組件內的標簽可以定義ref屬性來標識自己

2.3.1 字元串形式的refs
<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <!-- 引入prop-types,用於對組件標簽進行限制 -->
    <script src="../js/prop-types.js" type="text/javascript"></script>
    <script type="text/babel">
        class Demo extends React.Component {
            showData = () => {
                const {input1} = this.refs
                alert(input1.value)
            }
            showData2 = () => {
                const {input2} = this.refs
                alert(input2.value)
            }
            render() {
                return (
                    <div>
                        <input ref="input1" type="text" placeholder="點擊按鈕提示數據"/>
                        <button onClick={this.showData}>點我提示左側數據</button>
                        <input ref="input2" onBlur={this.showData2} type="text" placeholder="失去焦點提示數據"/>
                    </div>
                )
            }
        }
        ReactDOM.render(<Demo/>, document.getElementById('ctx'))
    </script>    
</body>
2.3.2 回調函數形式的refs
<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <!-- 引入prop-types,用於對組件標簽進行限制 -->
    <script src="../js/prop-types.js" type="text/javascript"></script>
    <script type="text/babel">
        class Demo extends React.Component {
            showData = () => {
                const {input1} = this
                alert(input1.value)
            }
            showData2 = () => {
                const {input2} = this
                alert(input2.value)
            }
            render() {
                return (
                    <div>
                        <input ref={c => this.input1 = c} type="text" placeholder="點擊按鈕提示數據"/>
                        <button onClick={this.showData}>點我提示左側數據</button>
                        <input onBlur={this.showData2} ref={c => this.input2 = c} type="text" placeholder="失去焦點提示數據"/>
                    </div>
                )
            }
        }
        ReactDOM.render(<Demo/>, document.getElementById('ctx'))
    </script>    
</body>
2.3.3 createRef
<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <!-- 引入prop-types,用於對組件標簽進行限制 -->
    <script src="../js/prop-types.js" type="text/javascript"></script>
    <script type="text/babel">
        class Demo extends React.Component {
            myRef = React.createRef()
            showData = () => {
                console.log(this.myRef)
                alert(this.myRef.current.value)
            }
            render() {
                return (
                    <div>
                        <input ref={this.myRef} type="text" placeholder="點擊按鈕提示數據"/>
                        <button onClick={this.showData}>點我提示左側數據</button>
                    </div>
                )
            }
        }
        ReactDOM.render(<Demo/>, document.getElementById('ctx'))
    </script>    
</body>
2.3.4 事件處理

image-20221020005016547

2.4 收集表單數據

2.4.1 受控組件
<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <!-- 引入prop-types,用於對組件標簽進行限制 -->
    <script src="../js/prop-types.js" type="text/javascript"></script>
    <script type="text/babel">
        class Demo extends React.Component {
            state = {
                username: '',
                password: ''
            }
            saveUsername = (e) => {
                this.setState({username: e.target.value})
            }
            savePassword = (e) => {
                this.setState({password: e.target.value})
            }
            handleSubmit = (e) => {
                e.preventDefault() // 阻止form表單提交事件
                const {username, password} = this.state
                alert(`username: ${username.value}, password: ${password.value}`)
            }
            render() {
                return (
                    <form onSubmit={this.handleSubmit}>
                        用戶名:<input onChange={this.saveUsername} type="text" name="username"/>
                        密  碼:<input onChange={this.savePassword} type="text" placeholder="password"/>
                        <button>login</button>
                    </form>
                )
            }
        }
        ReactDOM.render(<Demo/>, document.getElementById('ctx'))
    </script>    
</body>
2.4.2 非受控組件
<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <!-- 引入prop-types,用於對組件標簽進行限制 -->
    <script src="../js/prop-types.js" type="text/javascript"></script>
    <script type="text/babel">
        class Demo extends React.Component {
            handleSubmit = (e) => {
                e.preventDefault() // 阻止form表單提交事件
                const {username, password} = this
                alert(`username: ${username.value}, password: ${password.value}`)
            }
            render() {
                return (
                    <form onSubmit={this.handleSubmit}>
                        用戶名:<input ref={c => this.username = c} type="text" name="username"/>
                        密  碼:<input ref={c => this.password = c} type="text" placeholder="password"/>
                        <button>login</button>
                    </form>
                )
            }
        }
        ReactDOM.render(<Demo/>, document.getElementById('ctx'))
    </script>    
</body>
2.4.3 函數的柯里化
<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <!-- 引入prop-types,用於對組件標簽進行限制 -->
    <script src="../js/prop-types.js" type="text/javascript"></script>
    <script type="text/babel">
        class Demo extends React.Component {
            state = {
                username: '',
                password: ''
            }
        		/**
             * 高階函數:如果一個函數符合下麵兩個規範中的任一,那該函數就是高階函數
             * 1. 若A函數接收的參數是一個函數,那麼A就可以稱之為高階函數
             * 2. 若A函數調用的返回值依然是一個函數,那麼A就可以稱之為高階函數
             * 函數的柯里化:通過函數調用繼續返回函數的方式,實現多次接收參數,最後統一處理的函數編碼形式
             */
            saveFormData = (dataType) => {
                return (e) => {
                    return this.setState({[dataType]: e.target.value})
                }
            }
            handleSubmit = (e) => {
                e.preventDefault() // 阻止form表單提交事件
                const {username, password} = this.state
                alert(`username: ${username.value}, password: ${password.value}`)
            }
            render() {
                return (
                    <form onSubmit={this.handleSubmit}>
                        用戶名:<input onChange={this.saveFormData('username')} type="text" name="username"/>
                        密  碼:<input onChange={this.saveFormData('password')} type="text" placeholder="password"/>
                        <button>login</button>
                    </form>
                )
            }
        }
        ReactDOM.render(<Demo/>, document.getElementById('ctx'))
    </script>    
</body>

2.5 組件生命周期

2.5.1 舊版生命周期
image-20221022113756797
<body>
    <div id="ctx"></div>
    <script src="https://cdn.staticfile.org/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.staticfile.org/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.staticfile.org/babel-standalone/6.26.0/babel.min.js"></script>
    <!-- 引入prop-types,用於對組件標簽進行限制 -->
    <script src="../js/prop-types.js" type="text/javascript"></script>
    <script type="text/babel">
        class Count extends React.Component {

            constructor(props) {
                console.log('Count-constructor')
                super(props)
                this.state = {
                    count: 0
                }
            }
            add = () => {
                const {count} = this.state
                this.setState({
                    count: count+1
                })
            }
            death = () => {
                ReactDOM.unmountComponentAtNode(document.getElementById('ctx'))
            }
            force = () => {
                this.forceUpdate()
            }
            componentWillMount() {
                console.log('Count-componentWillMount')
            }
            componentDidMount() {
                console.log('Count-componentDidMount')
            }
            shouldComponentUpdate() {
                console.log('Count-shouldComponentUpdate')
                return false
            }
            componentWillUpdate() {
                console.log('Count-componentWillUpdate')
            }
            componentDidUpdate() {
                console.log('Count-componentDidUpdate')
            }
            componentWillUnmount() {
                console.log('Count-componentWillUnmount')
            }
            
            render() {
                console.log('Count-render')
                const {count} = this.state
                return (
                    <div>
                        <h2>當前求和為: {count}</h2>
                        <button onClick={this.add}>點我+1</button>
                        <button onClick={this.death}>卸載組件</button>
                        <button onClick={this.force}>強制更新</button>
                    </div>
                )
            }
        }
        
        // 父組件A
        class A extends React.Component {
            state = {
                carName: '賓士'
            }
            changeCar = () => {
                this.setState({carName: '奧迪'})
            }
            render() {
                return (
                    <div>
                        <div>A component</div>
                        <button onClick={this.changeCar}>換車</button>
                        <B carName={this.state.carName}/>
                    </div>
                )
            }
        }
        // 子組件B
        class B extends React.Component {
            // 第一次渲染不會調用這個鉤子
            componentWillReceiveProps(props) {
                console.log('B-componentWillReceiveProps', props)
            }
            render() {
                return (
                    <div>
                        <div>B component: carName={this.props.carName}</div>
                    </div>
                )
            }
        }
        // ReactDOM.render(<Count/>, document.getElementById('ctx'))
        ReactDOM.render(<A/>, document.getElementById('ctx'))
    </script>    
</body>
2.5.2 新版生命周期
image-20221023140121313
<body>
    <div id="ctx"></div>
    <script src="../newjs/react.development.js"></script>
    <script src="../newjs/react-dom.development.js"></script>
    <script src="../js/babel.min.js"></script>
    <!-- 引入prop-types,用於對組件標簽進行限制 -->
    <script src="../js/prop-types.js" type="text/javascript"></script>
    <script type="text/babel">
        class Count extends React.Component {

            constructor(props) {
                console.log('Count-constructor')
                super(props)
                this.state = {
                    count: 0
                }
            }
            add = () => {
                const {count} = this.state
                this.setState({
                    count: count+1
                })
            }
            death = () => {
                ReactDOM.unmountComponentAtNode(document.getElementById('ctx'))
            }
            force = () => {
                this.forceUpdate()
            }
            // 在更新之前獲取快照,方法返回值將會作為參數傳遞給componentDidUpdate鉤子
            getSnapshotBeforeUpdate () {
                console.log('getSnapshotBeforeUpdate')
                return 'liergou'
            }
            // getDerivedStateFromProps方法的返回值會作為state的值
            static getDerivedStateFromProps (props, state) {
                console.log('getDeriverdStateFromProps', props, state)
                return null
            }
            componentDidMount() {
                console.log('Count-componentDidMount')
            }
            shouldComponentUpdate() {
                console.log('Count-shouldComponentUpdate')
                return true
            }
            componentDidUpdate(preProps, preState, snapshotValue) {
                console.log('Count-componentDidUpdate', preProps, preState, snapshotValue)
            }
            componentWillUnmount() {
                console.log('Count-componentWillUnmount')
            }
            
            render() {
                console.log('Count-render')
                const {count} = this.state
                return (
                    <div>
                        <h2>當前求和為: {count}</h2>
                        <button onClick={this.add}>點我+1</button>
                        <button onClick={this.death}>卸載組件</button>
                        <button onClick={this.force}>強制更新</button>
                    </div>
                )
            }
        }
        ReactDOM.render(<Count age={88}/>, document.getElementById('ctx'))
    </script>    
</body>

2.6 虛擬DOM與DOM Diff演算法

https://segmentfault.com/a/1190000012921279

第三章:React應用(基於React腳手架)

第四章:React ajax

第五章:React-router

第六章:React UI 組件庫

第七章:Redux


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 你認為Mac OS上內建的Finder太有限了嗎?path finder mac版提供了Mac用戶期望的功能,Finder應用程式可以證明對於基本文件管理任務已足夠,但不提供太多自定義選項。Path Finder中文版是一款Mac應用程式,可保留相同的熟悉設計,同時能夠根據自己的工作風格進行模製。值 ...
  • 本章的目的:如何構造一個好的資料庫模式 6.1 問題的提出: 關係模式的表示: 關係模式由五部分組成,是一個五元組:R(U,D,DOM,F) R表示關係模式名 U表示一組屬性 D表示U的取值範圍,如Son的取值範圍是0-100 DOM表示屬性的域映射,如age到整數100,中的映射 F為屬性組U的組 ...
  • 1、redis哨兵(Sentinel) 1.1、redis集群介紹 前面文章講的主從複製集群是無法實現master和slave角色的自動切換的,如果master節點出現現redis服務異常、主機斷電、磁碟損壞等問題導致master無法使用,而redis主從複製無法實現自動的故障轉移(將slave 自 ...
  • 轉載自作者zhang502219048的微信公眾號【SQL資料庫編程】:Sql Server性能排查和優化懶人攻略 很多年前,筆者那時剛從廣東技術師範學院(現為廣東技術師範大學,以前為廣東民族學院)的電腦科學學院電腦科學與技術(師範)專業(廣東專插本,本科插本生,跨專業)畢業不久,還沒怎麼瞭解索 ...
  • 11月4日,華為開發者大會HDC2022在東莞松山湖拉開帷幕。HMS Core在本次大會上帶來了包括音頻編輯服務的高擬真歌聲合成技術、視頻編輯服務的智能提取精彩瞬間功能、3D Engine超大規模數字世界實時渲染技術,以及為聽障人群發聲的手語服務等HMS Core最新技術能力進展 。此外,HMS C ...
  • 好家伙,JS基礎接著學, 本篇內容為《JS高級程式設計》第四章學習筆記 1.原始值和引用值 ECMAScript變數可以包含兩種不同類型的數據:原始值和引用值。原始值(primitive value)就是最簡單的數據,引用值(reference value)則是由多個值構成的對象。 在把一個值賦給變 ...
  • 前言 這是疫情可視化最開始的文章,有需要瞭解的可前往查看:https://www.cnblogs.com/xi12/p/16690119.html。 本來說有時間就把這個項目完結了的,結果後面一直有事拖著,直到現在十一月份了才搞完。老樣子,先看成果。 瀏覽鏈接:https://xi1213.gite ...
  • call,apply,bind都是一種方法。 一,call() ①:call() 是可以 調用函數的。 1 function fn() { 2 console.log(12) 3 } 4 5 fn.call() // 12 ②:通過給call() 內部傳參,可以改變 this指向。 1 let Do ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...