日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

从零开始的React学习(一)

發(fā)布時(shí)間:2024/1/18 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始的React学习(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

React基礎(chǔ)

寫在前面:這是我學(xué)習(xí)B站黑馬React視頻前75p所作的筆記。
后續(xù)的學(xué)習(xí)也會(huì)整理出筆記,供自己之后翻閱,也希望能給你帶來一些幫助。

(1)概述

? 用于構(gòu)建用戶界面的JavaScript庫(kù)

(2)特點(diǎn)

  • 基于組件
  • 學(xué)習(xí)一次,隨處使用

(3)基本安裝與使用

  • 安裝命令

    npm i react react-dom
  • 使用

    // 1.導(dǎo)入react和react-dom文件 import React from 'react' import ReactDOM from 'react-dom'// 2.創(chuàng)建react元素 const title = React.createElement('h1', null, 'hello world!')// 3.渲染react元素 ReactDOM.render(title, document.getElementById('root'))
  • (4)腳手架安裝與使用

  • 意義

    • 腳手架是開發(fā)現(xiàn)代Web應(yīng)用的必備
    • 充分利用Webpack、Babel、ESLint等工具輔助項(xiàng)目開發(fā)
    • 零配置,無需手動(dòng)配置繁瑣的工具即可使用
    • 關(guān)注業(yè)務(wù),而不是工具配置
  • 初始化

    npx create-react-app my-appnpx 是npm v5.2.0 引入的一條命令 目的是提升包內(nèi)提供的命令行工具的使用體驗(yàn); 原來需要先安裝腳手架包,再使用這個(gè)包中提供的命令;現(xiàn)在無需安裝腳手架包,可以直接使用這個(gè)包中提供的命令。
  • 使用

    同上。

    啟動(dòng)命令 yarn start 或 npm start
  • (5)React Developer Tools 相關(guān)問題

    這是我個(gè)人遇到的一些相關(guān)問題:

  • 安裝:不能科學(xué)上網(wǎng)時(shí)chrome商店打不開,就度娘找找資源,下載然后拖到瀏覽器擴(kuò)展應(yīng)用里會(huì)自動(dòng)安裝。
  • 不能動(dòng)態(tài)顯示數(shù)據(jù):我的原因是自己在 component里的Hide components where…加了過濾,去掉過濾就好
  • 控制臺(tái)可能有警告(強(qiáng)迫癥難受):把瀏覽器的迅雷下載組件刪了,或者是把瀏覽器F12的setting下的Preferences里的 Enable JavaScript source maps 和 Enable CSS source maps取消勾選即可
  • 插件不可用:在擴(kuò)展應(yīng)用的React Developer Tools 的詳情里,打開 “允許訪問文件網(wǎng)址”
  • 一、基礎(chǔ)

    (1)JSX的基本使用

    ? 用React.createElement()繁瑣,不直觀,不優(yōu)雅。

    JSX簡(jiǎn)介

    JSX是React的核心內(nèi)容。是JavaScript XML簡(jiǎn)寫。優(yōu)勢(shì)是聲明式的語法,更加直觀,與HTML結(jié)構(gòu)相同,降低學(xué)習(xí)成本,提高開發(fā)效率。

    1.使用步驟
    /* 使用JSX創(chuàng)建React元素 */ const title = (<h1 className="title">hello JSX!<span>這是span</span></h1> ) // 渲染react元素 const root = document.getElementById('root') ReactDOM.render(title, root)

    為什么腳手架中可以使用JSX語法?

    • JSX不是標(biāo)準(zhǔn)的ECMAScript語法,是ECMAScript的語法擴(kuò)展

    • 需要使用babel編譯處理后才能在瀏覽器環(huán)境使用

    • create-react-app腳手架中已經(jīng)默認(rèn)有該配置,無需手動(dòng)配置

    • 編譯JSX語法的包:@babel/preset-react

    2.注意點(diǎn)
    • React元素的屬性使用駝峰命名法
    • 特殊屬性名: class -> className; for -> htmlFor; tabindex -> tabIndex
    • 沒有子節(jié)點(diǎn)的React元素可以用 /> 結(jié)尾
    • 推薦:使用小括號(hào)包裹JSX,從而避免JS中自動(dòng)插入分號(hào)陷阱
    3.JSX中使用JavaScript表達(dá)式
    /* JSX中使用JavaScript表達(dá)式 */ const name = 'Tom' const age = 19 const title = (<h1>hello {name} ! 年齡: {age}</h1> ) ReactDOM.render(title, document.getElementById('root'))/* 條件渲染 */ const isLoading = false const loadData = () => {if (isLoading) {return (<div>loading...</div>)}return (<div>數(shù)據(jù)加載完成,此處顯示加載后的數(shù)據(jù)</div>) }// 三元表達(dá)式 const loadData = () => {return isLoading ? (<div>loading...</div>) : (<div>數(shù)據(jù)加載完成</div>) }// 邏輯運(yùn)算符 const loadData = () => {return isLoading && (<div>loading...</div>) }const load = (<h1>條件渲染:{loadData()}</h1> ) ReactDOM.render(load, document.getElementById('root'))
    4.JSX列表渲染
    /* 列表渲染 */ const songs = [{ id: 1, name: '癡心絕對(duì)'},{ id: 2, name: '阿拉斯加的海灣'},{ id: 3, name: '長(zhǎng)安姑娘'}, ]const list = (<ul>{songs.map(item => {return (<li key={item.id}>{item.name}</li>)})}</ul> )ReactDOM.render(list, document.getElementById('root'))
    5.JSX樣式處理
    // 類名,外部引入 import './index.css'// 行內(nèi)樣式 const list = (<h1 className="title" style={{color: 'skyblue', backgroundColor: 'pink'}}>JSX的樣式處理</h1> )ReactDOM.render(list, document.getElementById('root'))

    總結(jié)

  • JSX是React的核心內(nèi)容
  • JSX表示在JS代碼中寫HTML結(jié)構(gòu),是React聲明式的體現(xiàn)
  • 使用JSX配合嵌入的JS表達(dá)式、條件渲染、列表渲染、可以描述任意UI結(jié)構(gòu)
  • 推薦使用類名給JSX添加樣式
  • React完全利用JS語言自身的能力來編寫UI,而不是造輪子增強(qiáng)HTML功能
  • (2)React組件

    組件介紹

    • 組件是React的一等公民,使用React就是在用組件
    • 組件表示頁面中的部分功能
    • 組合多個(gè)組件實(shí)現(xiàn)完整的頁面功能
    • 特點(diǎn):可復(fù)用、獨(dú)立、可組合
    1.創(chuàng)建方式
    • 使用函數(shù)創(chuàng)建
    • 使用類創(chuàng)建
    • 抽離為獨(dú)立的JS文件
    2.React事件處理
    import React from 'react'/* React事件處理 */ // 使用類組件形式class App extends React.Component {// 事件處理程序handleClick() {console.log('單擊事件觸發(fā)了')}render() {return (<button type="" onClick={this.handleClick}>點(diǎn)我</button>)}}// 使用函數(shù)組件形式 function App() {function handleClick() {console.log('函數(shù)組件的點(diǎn)擊事件被觸發(fā)了')}return (// 和類組件相比,就沒有this,可以直接通過函數(shù)名<button type="" onClick={handleClick}>函數(shù)組件-點(diǎn)我</button>) }export default App
    3.React事件對(duì)象
    import React from 'react' /* React事件對(duì)象 (合成事件) */ // 使用類組件形式 class App extends React.Component { // 事件處理程序 handleClick(e) { // 阻止默認(rèn)行為 e.preventDefault() console.log('a標(biāo)簽單擊事件觸發(fā)了') console.log('事件對(duì)象:', e) } render() { return ( <a href="https://www.bilibili.com" onClick={this.handleClick}>B站</a> ) }} export default App
    4.有狀態(tài)組件/無狀態(tài)組件
    import React from 'react'/* React有無狀態(tài)組件 */ // 函數(shù)組件又叫做無狀態(tài)組件,類組件又叫做有狀態(tài)組件 // 狀態(tài)(state)即數(shù)據(jù) // 函數(shù)組件沒有自己的狀態(tài),只負(fù)責(zé)數(shù)據(jù)展示(靜) // 類組件有自己的狀態(tài),負(fù)責(zé)更新UI,讓頁面“動(dòng)起來”/* state的基本使用 */ // 狀態(tài)是可以改變的,通過setState({要修改的數(shù)據(jù)})來修改數(shù)據(jù);不能直接修改state中的值 // setState() 1.修改狀態(tài) 2.更新UI // 數(shù)據(jù)驅(qū)動(dòng)的思想// 使用類組件形式 class App extends React.Component {// constructor() {// super()// // 初始化狀態(tài)// this.state = {// count: 0// }// }// 簡(jiǎn)化語法初始化statestate = {count: 0,test: 'a'}// render() {// return (// <div>// <h1>計(jì)數(shù)器:{this.state.count}</h1>// <button type="" onClick={// () => {// 這里的this指向外部環(huán)境,即render()方法,就是當(dāng)前組件的實(shí)例,所以可以正常執(zhí)行// this.setState({// count: this.state.count + 1// })// }// }>+1</button>// </div>// )// }// 抽離邏輯代碼// 解決this指向問題// 1.箭頭函數(shù)// 2.Function.prototype.bind()// 3.class的實(shí)例方法(也是利用箭頭函數(shù)this指向的特點(diǎn))// 利用ES5的bind方法,將事件處理程序中的this與組件實(shí)例綁定到一起// constructor() {// constructor里的this也是指向?qū)嵗?/ super()// state也可以放在這里// this.state = {// count: 0// }// this.onIncrease = this.onIncrease.bind(this)// }// 事件處理程序// onIncrease() {// this.setState({// count: this.state.count + 1// })// }// 第三種改變this指向的方法onIncrease = () => {this.setState({count: this.state.count + 1})}render() {return (<div><h1>計(jì)數(shù)器:{this.state.count}</h1>{/*箭頭函數(shù)本身不綁定this,這里的this指向外部環(huán)境,即render()方法,就是當(dāng)前組件的實(shí)例,所以可以正常執(zhí)行 */}{/* <button type="" onClick={() => this.onIncrease()}>點(diǎn)我+1</button> */}<button type="" onClick={this.onIncrease}>+1</button></div>)} }export default App
    5.表單處理-受控組件
    import React from 'react'/* React表單處理 */ /* 1.受控組件:受到React控制的表單元素HTML中表單元素是可輸入的,也就是有自己可變的狀態(tài),而React中可變狀態(tài)通常保存在state中,并且只能通過setState()方法來修改;React將state與表單元素值value綁定到一起,由state的值來控制表單元素的值 */ // 步驟 // 1.在state中添加一個(gè)狀態(tài),作為表單元素的value值 // 2.給表單元素綁定change事件,將表單元素的值設(shè)置為state的值(控制表單元素值的變化)// 問題:每個(gè)表單元素都有一個(gè)單獨(dú)的事件處理程序 // 優(yōu)化步驟 // 1.給表單元素添加name屬性,名稱與state相同 // 2.根據(jù)表單元素類型獲取對(duì)應(yīng)值(有些表單是value,有的是checked) // 3.在change事件處理程序中通過[name]來修改對(duì)應(yīng)的state// 使用類組件形式 class App extends React.Component {// 簡(jiǎn)化語法初始化statestate = {txt: '',content: '',city: 'bj',isChecked: false}handleChange = (e) => {this.setState({txt: e.target.value})}// 處理富文本框handleContent = e => {this.setState({content: e.target.value})}// 處理下拉框handleCity = e => {this.setState({city: e.target.value})}// 處理復(fù)選框// handleCheckBox = e => {// this.setState({// isChecked: e.target.checked// })// }/* 事件處理程序優(yōu)化*/handleAllChange = e => {// 獲取當(dāng)前DOM對(duì)象const target = e.target// 根據(jù)類型判斷獲取值const value = target.type === 'checkbox' ? target.checked : target.value// 獲取nameconst name = target.namethis.setState({[name]: value})}render() {return (<div>{/* 文本框 */}{/* <input type="text" name="txt" value={this.state.txt} onChange={this.handleChange} /> */}<input type="text" name="txt" value={this.state.txt} onChange={this.handleAllChange} />{/* 富文本框 */}{/* <textarea rows="" cols="" name="content" value={this.state.content} onChange={this.handleContent}></textarea> */}<textarea rows="" cols="" name="content" value={this.state.content} onChange={this.handleAllChange}></textarea>{/* 下拉框 */}{/* <select name="city" value={this.state.city} onChange={this.handleCity}> */}<select name="city" value={this.state.city} onChange={this.handleAllChange}><option value="sh">上海</option><option value="bj">北京</option><option value="wh">武漢</option></select><br/>{/* 復(fù)選框 */}{/* <input name="isChecked" type="checkbox" checked={this.state.isChecked} onChange={this.handleCheckBox}/> */}<input name="isChecked" type="checkbox" checked={this.state.isChecked} onChange={this.handleAllChange}/></div>)} }export default App
    6.表單處理-非受控組件
    import React from 'react'/* 2.非受控組件(不推薦)借助ref,使用原生DOM方式來獲取表單元素值ref的作用:獲取DOM或組件 */ // 使用步驟 // 1.使用React.createRef()方法創(chuàng)建一個(gè)ref對(duì)象 // 2.將創(chuàng)建好的ref對(duì)象添加到文本框中(關(guān)聯(lián)表單元素) // 3.通過ref對(duì)象獲取到文本框的值// 使用類組件形式 class App extends React.Component {constructor() {super()// 創(chuàng)建refthis.txtRef = React.createRef()}// 獲取文本框的值getTxt = () => {console.log('文本框的值為:', this.txtRef.current.value)}render() {return (<div><input type="text" ref={this.txtRef} /><button type="" onClick={this.getTxt}>獲取文本框的值</button></div>)} }export default App

    總結(jié)

  • 組件的兩種創(chuàng)建方式:函數(shù)組件和類組件
  • 無狀態(tài)(函數(shù))組件負(fù)責(zé)靜態(tài)結(jié)構(gòu)展示
  • 有狀態(tài)(類)組件負(fù)責(zé)更新UI,讓頁面動(dòng)起來
  • 綁定事件注意this指向問題
  • 推薦使用受控組件來處理表單
  • 完全利用JS語言的能力創(chuàng)建組件,這是React的思想
  • 二、進(jìn)階

    (1)React組件進(jìn)階

    組件通訊介紹

    組件是獨(dú)立且封閉的單元,默認(rèn)情況下只能使用組件自己的數(shù)據(jù)。組件化過程中多個(gè)組件之間不可避免的要共享某些數(shù)據(jù)。為了實(shí)現(xiàn)這些功能,就需要打破組件的獨(dú)立封閉性,讓其與外界溝通。這個(gè)過程就是組件通訊。

    1.組件的props
    • props作用:接收傳遞給組件的數(shù)據(jù)
    • 傳遞數(shù)據(jù):給組件標(biāo)簽添加屬性
    • 接收數(shù)據(jù):函數(shù)組件通過參數(shù)props接收數(shù)據(jù),類組件通過this.props接收數(shù)據(jù)
    import React from 'react' // import ReactDOM from 'react-dom'/* props */ // 2.函數(shù)組件接收數(shù)據(jù) // const App = (props) => { // // props是一個(gè)對(duì)象 // console.log(props) // return ( // <div> // <h1>props: {props.name}</h1> // </div> // ) // }// 類組件接收數(shù)據(jù) class App extends React.Component {// 推薦使用props作為構(gòu)造函數(shù)參數(shù)constructor(props) {super(props)console.log(props)}render() {return (<div><h1>props: {this.props.name}</h1></div>)} }// 1.傳遞數(shù)據(jù) // ReactDOM.render(<App name="Tom" age={19}></App>, document.getElementById('root'))

    特點(diǎn)

    • 可以給組件傳遞任意類型的數(shù)據(jù)(字符串“ ”,非字符串直接用 { } 包裹;可以傳數(shù)字、數(shù)組、函數(shù)、jsx)
    • props是只讀的對(duì)象,只能讀取屬性的值,無法修改對(duì)象
    • 使用類組件時(shí),如果寫了構(gòu)造函數(shù),應(yīng)該將props傳遞給super(),否則無法在構(gòu)造函數(shù)中獲取到props
    2.組件通訊的三種方式
    2.1 父組件傳給子組件
  • 父組件提供要傳遞的state數(shù)據(jù)

  • 給子組件標(biāo)簽添加屬性,值為state中的數(shù)據(jù)

  • 子組件中通過props接收父組件中傳遞的數(shù)據(jù)

  • import React from 'react' /* 組件通訊的三種方式 */ // 父組件傳給子組件 // 父組件 class Parent extends React.Component {state = {lastName: "wang"}render() {return (<div className="parent">父組件:<Child name={this.state.lastName}></Child></div>)} }// 子組件 const Child = (props) => {return (<div className="child"><p>子組件接收到父組件的數(shù)據(jù):{props.name}</p></div>) }export default Parent
    2.2 子組件傳給父組件

    **思路:**利用回調(diào)函數(shù),父組件提供回調(diào)函數(shù),子組件調(diào)用,將要傳遞的數(shù)據(jù)作為回調(diào)函數(shù)的參數(shù)。(和Vue是一樣的)

    **注意:**回調(diào)函數(shù)this指向的問題

  • 父組件提供一個(gè)回調(diào)函數(shù)(用于接收數(shù)據(jù))
  • 將該函數(shù)作為屬性的值,傳遞給子組件
  • 子組件通過props調(diào)用回調(diào)函數(shù)
  • 將子組件的數(shù)據(jù)作為參數(shù)傳遞給回調(diào)函數(shù)
  • import React from 'react'/* 組件通訊的三種方式 */// 子組件傳給父組件 // 父組件 class Parent extends React.Component {state = {parentMsg: ''}// 提供回調(diào)函數(shù),用來接收數(shù)據(jù)getChildMsg = (data) => {console.log('接收到子組件中傳遞過來的數(shù)據(jù):', data)this.setState({parentMsg: data})}render() {return (<div className="parent">父組件:{this.state.parentMsg}<Child getMsg={this.getChildMsg}></Child></div>)} }// 子組件 class Child extends React.Component {state = {msg: "呷哺呷哺"}handleClick = () => {// 子組件調(diào)用父組件傳遞過來的回調(diào)函數(shù)this.props.getMsg(this.state.msg)}render() {return (<div className="child">子組件:<button onClick={this.handleClick}>點(diǎn)我,給父組件傳遞數(shù)據(jù)</button></div>)} }export default Parent
    2.3 兄弟組件之間通訊

    **思路:**將共享狀態(tài)提升到最近的公共父組件中,由公共父組件管理這個(gè)狀態(tài)(狀態(tài)提升

    • 公共父組件職責(zé):1.提供共享狀態(tài);2.提供操作共享狀態(tài)的方法
    • 要通訊的子組件只要通過props接收狀態(tài)或操作狀態(tài)的方法
    import React from 'react'/* 組件通訊的三種方式 *//* 兄弟組件之間通訊 */ // 公共父組件 class Parent extends React.Component {// 提供共享狀態(tài)state = {count: 0}// 提供修改共享狀態(tài)的方法onIncrease = () => {this.setState({count: this.state.count + 1})}render() {return (<div><Child1 count={this.state.count}/><Child2 onIncrease={this.onIncrease}/></div>)} }// 子組件1 const Child1 = (props) => {return (<h1>計(jì)數(shù)器:{props.count}</h1>) }// 子組件2 const Child2 = (props) => {return (<button onClick={() => props.onIncrease()}>點(diǎn)我+1</button>) }export default Parent
    3.Context

    **作用:**跨組件傳遞數(shù)據(jù)(比如:主題、語言等)

    使用步驟:

  • 調(diào)用 React.createContext() 創(chuàng)建 Provider(提供數(shù)據(jù))和 Consumer(消費(fèi)數(shù)據(jù))兩個(gè)組件

  • 使用 Provider 組件作為父節(jié)點(diǎn)

  • 設(shè)置value,表示要傳遞的數(shù)據(jù)

  • 使用Consumer組件接收數(shù)據(jù)

  • import React from 'react'/* Context */// 1.創(chuàng)建context得到兩個(gè)組件 const {Provider, Consumer} = React.createContext()class App extends React.Component {render() {return (// 2.使用 Provider 組件作為父節(jié)點(diǎn)// 3.設(shè)置value,表示要傳遞的數(shù)據(jù)<Provider value="pink"><div><Node/></div></Provider>)} }const Node = (props) => {return (<div>我是Node節(jié)點(diǎn)<SubNode/></div>) }const SubNode = (props) => {return (<div>我是SubNode節(jié)點(diǎn)<Child/></div>) }const Child = (props) => {return (<div>我是Child節(jié)點(diǎn){/* 4.使用Consumer組件接收數(shù)據(jù) */}<Consumer>{data => <h1>傳遞來的值 -- {data}</h1>}</Consumer></div>) }export default App

    總結(jié):

  • 如果兩個(gè)組件是”遠(yuǎn)房親戚“(比如多層嵌套)可以使用Context實(shí)現(xiàn)組件通訊
  • Context提供了兩個(gè)組件:Provider和Consumer
  • Provider組件:用來提供數(shù)據(jù)
  • Consumer組件:用來消費(fèi)數(shù)據(jù)
  • 4.props深入
    4.1 children屬性
    • children屬性:表示組件標(biāo)簽的子節(jié)點(diǎn)。當(dāng)組件標(biāo)簽有子節(jié)點(diǎn)時(shí),props就會(huì)有該屬性

    • children屬性與普通的props一樣,值可以是任意值(文本、React元素、組件,甚至是函數(shù))

    /* children屬性*//* children為文本節(jié)點(diǎn) */// const App = (props) => {// console.log(props)// return (// <div>// <h1>組件標(biāo)簽的子節(jié)點(diǎn):</h1>// {props.children}// </div>// )// }// ReactDOM.render(<App>我是子節(jié)點(diǎn)</App>, document.getElementById('root'))/* children為JSX或組件 */// const App = (props) => {// console.log(props)// return (// <div>// <h1>組件標(biāo)簽的子節(jié)點(diǎn):</h1>// {props.children}// </div>// )// }// ReactDOM.render(<App><p>我是子節(jié)點(diǎn),是一個(gè)p標(biāo)簽</p></App>, document.getElementById('root'))// const Test = () => <button>我是按鈕組件</button>// ReactDOM.render(<App><Test/></App>, document.getElementById('root'))/* children為函數(shù) */const App = (props) => {console.log(props)return (<div><h1>組件標(biāo)簽的子節(jié)點(diǎn):</h1>{props.children()}</div>)}// ReactDOM.render(<App>{ () => console.log('這是一個(gè)函數(shù)子節(jié)點(diǎn)')}</App>, document.getElementById('root'))
    4.2 props校驗(yàn)
    • 對(duì)于組件來說,props是外來的,無法保證組件使用者傳入什么格式的數(shù)據(jù)

    • 如果傳入的數(shù)據(jù)格式不對(duì),可能會(huì)導(dǎo)致組件內(nèi)部報(bào)錯(cuò)

    • 關(guān)鍵問題:組件的使用者不知道明確的錯(cuò)誤原因

    • props校驗(yàn):允許在創(chuàng)建組件的時(shí)候,就指定props的類型、格式等

    • 作用:捕獲使用組件時(shí)因?yàn)閜rops導(dǎo)致的錯(cuò)誤,給出明確的錯(cuò)誤提示,增加組件的健壯性

      使用步驟:

    • 安裝包:prop-types (yarn add prop-types / npm i prop-types)

    • 導(dǎo)入prop-types包

    • 使用 組件名.propTypes = {} 來給組件的props添加校驗(yàn)規(guī)則

    • 校驗(yàn)規(guī)則通過 PropTypes 對(duì)象來指定

      /* props校驗(yàn) */ // 導(dǎo)入 import PropTypes from 'prop-types'const App = (props) => {const arr = props.colorsconst lis = arr.map((item, index) => {return (<li key={index}>{item}</li>)})return (<ul>{lis}</ul>) }// 添加props校驗(yàn) App.propTypes = {colors: PropTypes.array }// ReactDOM.render(<App colors={19}></App>, document.getElementById('root')) // 會(huì)有明確的錯(cuò)誤提示 // Warning: Failed prop type: Invalid prop `colors` of type `number` supplied to `App`, expected `array`.// ReactDOM.render(<App colors={['red', 'blue']}></App>, document.getElementById('root'))
    • 約束規(guī)則:

    • 常見類型:array、bool、func、number、object、string

    • React元素類型:element

    • 必填項(xiàng):isRequired

    • 特定結(jié)構(gòu)的對(duì)象:shape({ })

    import React from 'react'/* props校驗(yàn)-約束規(guī)則*/// 導(dǎo)入import PropTypes from 'prop-types'const App = (props) => {return (<div><h1>props校驗(yàn):</h1></div>)}/* 添加props校驗(yàn)屬性 a 的類型:數(shù)值(number)屬性 fn 的類型:函數(shù)(func)并且為必填項(xiàng)屬性 tag 的類型:React元素(element)屬性 filter 的類型:對(duì)象({ area:'上海', price: 1999})*/App.propTypes = {a: PropTypes.number,fn: PropTypes.func.isRequired,tag: PropTypes.element,filter: PropTypes.shape({area: PropTypes.string,price: PropTypes.number})}export default App``` ###### 4.3 props的默認(rèn)值- 場(chǎng)景:分頁組件 → 每頁顯示條數(shù) - 作用:給props設(shè)置默認(rèn)值,在未傳入props時(shí)生效```jsx import React from 'react'/* props的默認(rèn)值 */const App = (props) => {console.log(props)return (<div><h1>props的默認(rèn)值:{props.pageSize}</h1></div>) }// 添加props默認(rèn)值 App.defaultProps = {pageSize: 10 }// ReactDOM.render(<App pageSize={20}></App>, document.getElementById('root')) // 這是顯示的就是 20 而不是 10export default App

    組件的生命周期

    1. 概述
    • 意義:組件的生命周期有助于理解組件的運(yùn)行方式、完成更復(fù)雜的組件功能,分析組件錯(cuò)誤原因等
    • 組件的生命周期:組件從被創(chuàng)建到掛載到頁面中運(yùn)行,再到組件不用時(shí)卸載的過程
    • 生命周期的每個(gè)階段總是伴隨著一些方法調(diào)用,這些方法就是生命周期的鉤子函數(shù)
    • 鉤子函數(shù)作用:為開發(fā)人員在不同階段操作組件提供了時(shí)機(jī)
    • 只有類組件才有生命周期
    2. 生命周期的三個(gè)階段
    • 每個(gè)階段的執(zhí)行時(shí)機(jī)
    • 每個(gè)階段鉤子函數(shù)的執(zhí)行順序
    • 每個(gè)階段鉤子函數(shù)的作用
  • 創(chuàng)建時(shí)(掛載階段)

    • 執(zhí)行時(shí)機(jī):組件創(chuàng)建時(shí)(頁面加載時(shí))

    • 執(zhí)行順序:constructor() → render() → componentDidMount()

      鉤子函數(shù)觸發(fā)時(shí)機(jī)作用
      constructor創(chuàng)建組件時(shí),最先執(zhí)行1.初始化state;2.為事件處理程序綁定this
      render每次組件渲染都會(huì)觸發(fā)渲染UI(注意:不能調(diào)用setState()
      componentDidMount組件掛載(完成DOM渲染后)1.發(fā)送網(wǎng)絡(luò)請(qǐng)求;2.DOM操作
  • import React from 'react'/* 組件生命周期 */ // 創(chuàng)建時(shí)(掛載階段) class App extends React.Component {constructor() {super()// 初始化statethis.state = {count: 0}// 處理this綁定問題// const title = document.getElementById('title')// 此時(shí)DOM還沒渲染,拿不到DOM// console.log(title) 結(jié)果:nullconsole.warn('生命周期鉤子函數(shù): 1.constructor')}componentDidMount() {// const title = document.getElementById('title')// 1.此時(shí)已經(jīng)完成DOM渲染,可以拿到DOM,進(jìn)行DOM操作// console.log(title)// 2.發(fā)送AJAX請(qǐng)求,獲取遠(yuǎn)程數(shù)據(jù)// axios.get('http://api....')console.warn('生命周期鉤子函數(shù): 3.componentDidMount')}render() {// 在render()里調(diào)用this.setState()會(huì)造成遞歸更新console.warn('生命周期鉤子函數(shù): 2.render')// 渲染返回內(nèi)容return (<div><h1 id="title">統(tǒng)計(jì)豆豆被打的次數(shù):</h1><button id="btn">打豆豆</button></div>)} }export default App
  • 更新時(shí)(更新階段)

    • 執(zhí)行時(shí)機(jī):1.setState(); 2.forceUpdate(); 3.組件接收到新的props

    • 說明:以上三者任意一種變化,組件都會(huì)重新渲染

    • 執(zhí)行順序:render() → componentDidUpdate()

      鉤子函數(shù)觸發(fā)時(shí)機(jī)作用
      render每次組件渲染都會(huì)觸發(fā)渲染UI(與 掛載階段 是同一個(gè)render)
      componentDidUpdate組件更新(完成DOM渲染)后1.發(fā)送網(wǎng)絡(luò)請(qǐng)求;2.DOM操作;注意:如果要setState()必須放在一個(gè)if條件中
      import React from 'react'/* 組件生命周期 */ // 更新時(shí)(更新階段) class App extends React.Component {constructor(props) {super(props)// 初始化statethis.state = {count: 0}}handleClick = () => {// 1.調(diào)用setState,此時(shí)父組件會(huì)重新渲染this.setState({count: this.state.count + 1})// 3.演示強(qiáng)制更新,即使屬性沒有更新也會(huì)強(qiáng)制更新// this.forceUpdate()}render() {return (<div>{/* 2.接收到新屬性,子組件也會(huì)更新 */}<Counter count={this.state.count}></Counter><button id="btn" onClick={this.handleClick}>打豆豆</button></div>)} }class Counter extends React.Component {render() {// 2.接收到新屬性,子組件也會(huì)更新console.warn('子組件——生命周期鉤子函數(shù): render')return (<h1 id="title">統(tǒng)計(jì)豆豆被打的次數(shù):{this.props.count}</h1>)}componentDidUpdate(prevProps) {console.warn('子組件——生命周期鉤子函數(shù): componentDidUpdate')// 可以獲取DOM// const title = document.getElementById('title')// console.log(title.innerHTML)// 注意:如果要調(diào)用setState()更新狀態(tài),必須要放在if條件中。否則也會(huì)造成遞歸更新// 原因:如果直接調(diào)用setState()更新狀態(tài),會(huì)再去執(zhí)行render(),render()執(zhí)行完會(huì)立即去執(zhí)行componentDidUpdate(),從而造成遞歸調(diào)用。// 做法:比較更新前后的props是否相同,來決定是否重新渲染組件console.log('prevProps: ', prevProps, '--currentProps: ', this.props)if (prevProps !== this.props) {this.setState({})// 發(fā)送ajax請(qǐng)求}/* 這里點(diǎn)擊“打豆豆”按鈕,會(huì)打印兩次結(jié)果:prevProps: {count: 0} --currentProps: {count: 1}prevProps: {count: 1} --currentProps: {count: 1}原因:第一次是點(diǎn)擊了按鈕,父組件狀態(tài)更新,子組件props發(fā)生變化,鉤子函數(shù)順序執(zhí)行到componentDidUpdate(),第二次是因?yàn)樽吡薸f里面的語句,調(diào)用完setState后,重新render后又要立即去執(zhí)行componentDidUpdate(),只不過此時(shí)沒有改變父組件狀態(tài),所以前后props是一樣的*/} }export default App
  • 卸載時(shí)(卸載階段)

    • 執(zhí)行時(shí)機(jī):組件從頁面中消失

    • 鉤子函數(shù)componentWillUnmount()

      鉤子函數(shù)觸發(fā)時(shí)機(jī)作用
      componentWillUnmount組件卸載(從頁面中消失)執(zhí)行清理工作(比如:清理定時(shí)器等)
      import React from 'react'/* 組件生命周期 */ // 卸載時(shí)(卸載階段) class App extends React.Component {constructor(props) {super(props)// 初始化statethis.state = {count: 0}}handleClick = () => {this.setState({count: this.state.count + 1})}render() {return (<div>{this.state.count > 3? <p>豆豆被打西內(nèi)了</p>: <Counter count={this.state.count}></Counter>}<button id="btn" onClick={this.handleClick}>打豆豆</button></div>)} }class Counter extends React.Component {componentDidMount() {// 開啟定時(shí)器this.timerId = setInterval(() => {console.log('定時(shí)器正在執(zhí)行~')}, 1000)}render() {return (<h1 id="title">統(tǒng)計(jì)豆豆被打的次數(shù):{this.props.count}</h1>)}componentWillUnmount() {console.warn('生命周期鉤子函數(shù):componentWillUnmount')// 清理定時(shí)器clearInterval(this.timerId)} }export default App
  • 3. 不常用鉤子函數(shù)

    **介紹:**react庫(kù)不斷更新,新老不匹配,移除舊的不常用鉤子函數(shù),加入新的鉤子函數(shù)

    舊版的生命周期,創(chuàng)建和更新的componentWillxxx不用了

    新版完整的生命周期,這兩個(gè)新的getxxxx也不是很推薦使用

    render-props和高階組件

    1. React組件復(fù)用
  • 概述

    • 思考:如果兩個(gè)組件中的部分功能相似或相同,該如何處理?
    • 處理方式:復(fù)用相似的功能(聯(lián)想函數(shù)封裝)
    • 復(fù)用什么?1.state 2.操作state的方法(組件狀態(tài)邏輯)
    • 兩種方式:1.render props模式 2.高階組件(HOC:high order component)
    • 注意:這兩種模式不是新的API,而是利用React自身特點(diǎn)的編碼技巧,演化而成的固定模式(寫法)
  • 2. render props模式

    (只是個(gè)名字,不一定就是使用 render)

    context其實(shí)用的就是render props模式,而且是children屬性

    思路分析

    • 思路:將要復(fù)用的state和操作state的方法封裝到一個(gè)組件中
    • 問題1:如何拿到該組件中復(fù)用的state?
    • 在使用組件時(shí),添加一個(gè)值為函數(shù)的prop,通過函數(shù)參數(shù)來獲取(需要組件內(nèi)部實(shí)現(xiàn))
    • 問題2:如何渲染任意的UI?
    • 使用該函數(shù)的返回值作為要渲染的UI內(nèi)容(需要組件內(nèi)部實(shí)現(xiàn))

    使用步驟

  • 創(chuàng)建Mouse組件,在組件中提供復(fù)用的狀態(tài)邏輯代碼(1.狀態(tài);2.操作狀態(tài)的方法)

  • 將要復(fù)用的狀態(tài)作為props.render(state)方法的參數(shù),暴露到組件外部

  • 使用props.render()的返回值作為要渲染的內(nèi)容

    import React from 'react' import PropTypes from 'prop-types' /* render props模式 */// 導(dǎo)入圖片資源 const catImgSrc = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.qiantucdn.com%2F58pic%2F27%2F51%2F73%2F30V58PICg4M_1024.jpg%21%2Ffw%2F780%2Fwatermark%2Furl%2FL3dhdGVybWFyay12MS4zLnBuZw%3D%3D%2Falign%2Fcenter%2Fcrop%2F0x1009a0a0&refer=http%3A%2F%2Fpic.qiantucdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1634716498&t=8cf797a6f75a9a570b1c760dc682c9e5"// 創(chuàng)建Mouse組件 class Mouse extends React.Component {// 鼠標(biāo)位置state(狀態(tài))state = {x: 0,y: 0}// 鼠標(biāo)移動(dòng)處理程序(操作狀態(tài)的方法)handleMouseMove = (e) => {this.setState({x: e.clientX,y: e.clientY})}// 監(jiān)聽鼠標(biāo)移動(dòng)事件componentDidMount() {window.addEventListener('mousemove', this.handleMouseMove)}// 在組件卸載時(shí)移除事件綁定componentWillUnmount() {window.removeEventListener('mousemove', this.handleMouseMove)}render() {// return null// 沒有渲染任何ui結(jié)構(gòu)// return this.props.render(this.state)// 用children屬性替換renderreturn this.props.children(this.state)} }// 添加props校驗(yàn) Mouse.propTypes = {children: PropTypes.func.isRequired }class App extends React.Component {constructor(props) {super(props)console.log(props)}render() {return (<div><h1>render props 模式</h1>{/* 這里的mouse形參,拿到的就是上面Mouse組件的this.state */}{/* <Mouse render={(mouse) => {// 可以拿到狀態(tài),具體展示形式就可以在使用組件的地方自行定義return <p>鼠標(biāo)位置:{mouse.x},{mouse.y}</p>}}></Mouse> */}{/* 貓捉老鼠 */}{/* <Mouse render={(mouse) => {return <img src={catImgSrc} alt="貓" width={100} style={{position: 'absolute',top: mouse.y - 50,left: mouse.x - 50}}/>}}></Mouse> */}{/* children屬性代替render */}<Mouse>{(mouse) => {return <p>children拿到鼠標(biāo)位置:{mouse.x},{mouse.y}</p>}}</Mouse>{/* children屬性代替render */}{/* 貓捉老鼠 */}<Mouse>{(mouse) => {return <img src={catImgSrc} alt="貓" width={100} style={{position: 'absolute',top: mouse.y - 50,left: mouse.x - 50}}/>}}</Mouse></div>)} }export default App
  • 代碼優(yōu)化

  • 推薦:給render props模式添加 props校驗(yàn)
  • 應(yīng)該在組件卸載時(shí)解除mousemove時(shí)間綁定
  • 3. 高階組件

    概述

    • 目的:實(shí)現(xiàn)狀態(tài)邏輯復(fù)用
    • 采用包裝(裝飾)模式,比如說:手機(jī)殼
    • 手機(jī):獲取保護(hù)功能
    • 手機(jī)殼:提供保護(hù)功能
    • 通過包裝組件,增強(qiáng)組件功能

    思路分析

    • 高階組件(HOC,Higher-Order Component)是一個(gè)函數(shù),接收要包裝的組件,返回增強(qiáng)后的組件。
    • 高階組件內(nèi)部創(chuàng)建一個(gè)類組件,在這個(gè)類組件中提供復(fù)用的狀態(tài)邏輯代碼,通過prop將復(fù)用的狀態(tài)傳遞給包裝組件WrappedComponent

    使用步驟

  • 創(chuàng)建一個(gè)函數(shù),名稱約定以with開頭
  • 指定函數(shù)參數(shù),參數(shù)應(yīng)該以大寫字母開頭(作為要渲染的組件)
  • 在函數(shù)內(nèi)部創(chuàng)建一個(gè)類組件,提供復(fù)用的狀態(tài)邏輯代碼,并返回
  • 在該組件中,渲染參數(shù)組件,同時(shí)將狀態(tài)通過props傳遞給參數(shù)組件
  • 調(diào)用該高階組件,傳入要增強(qiáng)的組件,通過返回值拿到增強(qiáng)后的組件,并將其渲染到頁面中。
  • 設(shè)置displayName

    • 使用高階組件存在的問題: 得到的兩個(gè)組件名稱相同
    • 原因:默認(rèn)情況下,React使用組件名稱作為displayName
    • 解決方式:為高階組件設(shè)置displayName便于調(diào)試時(shí)區(qū)分不同的組件
    • displayName的作用:用于設(shè)置調(diào)試信息(React Developer Tools信息)

    傳遞props

    • 問題:props丟失
    • 原因:高階組件沒有往下傳遞props
    • 解決方式:渲染W(wǎng)rappedComponent時(shí),將state和this.props一起傳遞給組件
    import React from 'react' /* 高階組件 */// 導(dǎo)入圖片資源 const catImgSrc = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.qiantucdn.com%2F58pic%2F27%2F51%2F73%2F30V58PICg4M_1024.jpg%21%2Ffw%2F780%2Fwatermark%2Furl%2FL3dhdGVybWFyay12MS4zLnBuZw%3D%3D%2Falign%2Fcenter%2Fcrop%2F0x1009a0a0&refer=http%3A%2F%2Fpic.qiantucdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1634716498&t=8cf797a6f75a9a570b1c760dc682c9e5"// 創(chuàng)建高階組件函數(shù) function withMouse(WrappedComponent) {// 該組件提供復(fù)用的狀態(tài)邏輯class Mouse extends React.Component {// 鼠標(biāo)狀態(tài)state = {x: 0,y: 0}handleMouseMove = e => {this.setState({x: e.clientX,y: e.clientY})}// 控制鼠標(biāo)狀態(tài)邏輯componentDidMount() {window.addEventListener('mousemove', this.handleMouseMove)}componentWillUnmount() {window.removeEventListener('mousemove', this.handleMouseMove)}render() {console.log('Mouse: ', this.props)// 將state和this.props一起傳遞給組件return <WrappedComponent {...this.state} {...this.props}></WrappedComponent>}}// 設(shè)置displayNameMouse.displayName = `WithMouse${getDisplayName(WrappedComponent)}`return Mouse }function getDisplayName(WrappedComponent) {return WrappedComponent.displayName || WrappedComponent.name || 'Component' }// 用來測(cè)試高階組件 const Position = props => {console.log('Position: ', props)return (<p>鼠標(biāo)當(dāng)前位置:(x: {props.x}, y: {props.y})</p>) }// 貓捉老鼠組件 const Cat = props => (<imgsrc={catImgSrc}alt="cat"width={100}style={{position: 'absolute',top: props.y - 50,left: props.x - 50}}/> )// 獲取增強(qiáng)后的組件 const MousePosition = withMouse(Position) const MouseCat = withMouse(Cat)class App extends React.Component {constructor(props) {super(props)console.log(props)}render() {return (<div><h1>高階組件</h1>{/* 渲染高階組件 */}{/* 這里的a="1"相當(dāng)于是傳給了高階函數(shù)里的Mouse組件 */}<MousePosition a="1"></MousePosition><MouseCat></MouseCat></div>)} }export default App

    總結(jié)

  • 組件通訊是構(gòu)建React應(yīng)用必不可少的一環(huán)
  • props的靈活性讓組件更加強(qiáng)大
  • 狀態(tài)提升是React組件的常用模式
  • 組件生命周期有助于理解組件的運(yùn)行過程
  • 鉤子函數(shù)讓開發(fā)者可以在特定的時(shí)機(jī)執(zhí)行某些功能
  • render props模式和高階組件都可以實(shí)現(xiàn)組件狀態(tài)邏輯復(fù)用
  • 組件極簡(jiǎn)模型:(state, props)=> UI
  • 總結(jié)

    以上是生活随笔為你收集整理的从零开始的React学习(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    99婷婷狠狠成为人免费视频 | 中文字幕中文字幕在线中文字幕三区 | 久久99久久99| 久久视频网址 | 精品国产一区二区在线 | 欧美 激情 国产 91 在线 | 91成版人在线观看入口 | 国产成人精品国内自产拍免费看 | 久草视频在线免费 | 伊人久久在线观看 | 中文字幕久久精品亚洲乱码 | 狠狠色噜噜狠狠狠狠2022 | 亚洲国产日韩一区 | 久久久久久久久久免费视频 | 久操视频在线 | 日日夜夜网 | 欧美a影视 | 国产一区视频免费在线观看 | 精品国产一区二区三区四区在线观看 | 欧美性生活久久 | 日韩欧美网址 | 高清av在线| 久久久免费少妇 | 麻豆影视网站 | 深爱开心激情网 | 久久久高清视频 | 久久99日韩 | 国产在线久久久 | 麻豆传媒视频在线免费观看 | 蜜桃久久久| 97av在线视频免费播放 | 狠狠干网址 | 碰超在线观看 | 91黄色影视 | 亚洲六月丁香色婷婷综合久久 | 成人黄在线观看 | 精品久久影院 | 日本在线观看中文字幕无线观看 | 国产精品久久久久久999 | 黄色午夜 | 亚洲免费精彩视频 | 在线看小早川怜子av | 在线91视频 | 国产精品免费在线 | 一区二区视频在线免费观看 | 456成人精品影院 | 草免费视频 | 国产视频一区在线 | 五月视频 | 九色91在线 | 日韩在线视频观看 | 日韩精品一区二区三区水蜜桃 | 久久美女高清视频 | 91在线播放国产 | 欧美性生交大片免网 | 国产91免费看 | 7777xxxx| 亚洲欧美在线视频免费 | 久久色在线播放 | 日本久热 | 97视频在线免费播放 | 国产极品尤物在线 | 日韩中文在线电影 | 欧美激情综合网 | 国产69精品久久99不卡的观看体验 | 成年人在线免费看 | 97视频人人澡人人爽 | 91精品婷婷国产综合久久蝌蚪 | 婷婷六月天在线 | 国产韩国精品一区二区三区 | 一区二区三区精品在线 | www.av在线.com | 狠狠色综合网站久久久久久久 | 在线亚洲高清视频 | 亚洲精品综合在线 | av品善网 | www视频免费在线观看 | 午夜国产一区二区三区四区 | 四虎在线视频免费观看 | 亚洲精品美女久久久 | 日韩伦理片一区二区三区 | 欧美一级片在线播放 | 国产精品久久久久国产精品日日 | 91在线中文 | 日本在线观看一区 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 日韩久久精品 | 久久爱www. | 天天操天天射天天 | 久久久久久麻豆 | 久久成人毛片 | 国产精品亚洲精品 | 亚洲a网 | 久久久网址 | 夜添久久精品亚洲国产精品 | 欧美色图视频一区 | 青青河边草免费观看完整版高清 | 中文字幕av专区 | 在线观看国产永久免费视频 | 国产黄网站在线观看 | 中文字幕日本特黄aa毛片 | 9色在线视频 | 亚洲情影院 | 亚洲综合一区二区精品导航 | av免费观看高清 | 99久久精品久久久久久动态片 | 国产一级免费av | 在线免费观看国产视频 | 国产男女免费完整视频 | 亚洲在线观看av | 国产91对白在线播 | 国产精品白丝jk白祙 | 国产亚洲综合在线 | 亚洲免费专区 | 亚洲精品456在线播放第一页 | 中文字幕精品一区 | 九九热国产| 91成人网在线播放 | 日韩精品一区二区三区水蜜桃 | 人人澡人人添人人爽一区二区 | 国产精品视频永久免费播放 | 中文字幕 国产精品 | 国产精品九九热 | 九九综合九九 | 久久久久成 | 日韩系列在线 | 99在线精品视频 | 久久久久久久久久国产精品 | 最近中文字幕第一页 | 天天综合91 | 成人羞羞免费 | 亚洲视频 一区 | 最近日本字幕mv免费观看在线 | 国产在线观看免费av | 国产视频一区二区在线观看 | 波多野结衣电影一区 | www.黄色片网站 | av专区在线 | 国产v在线播放 | 欧美福利视频一区 | 在线电影 你懂得 | 国产 在线 高清 精品 | 在线观看成人av | 国产1区在线观看 | 国产流白浆高潮在线观看 | 黄色www在线观看 | 久久视频国产精品免费视频在线 | 久久久久欧美精品999 | 久草在线99 | 91精品国自产在线 | 欧美色精品天天在线观看视频 | 日本中文在线观看 | 人人天天夜夜 | 精品国产乱码久久久久久1区二区 | 亚洲国产欧美一区二区三区丁香婷 | 亚洲国产精品一区二区久久,亚洲午夜 | 亚洲美女精品区人人人人 | 97综合在线 | 全久久久久久久久久久电影 | 日韩视频中文字幕在线观看 | 亚洲精品中文字幕在线 | 久久久久久中文字幕 | 国产护士hd高朝护士1 | www.com久久| 精品一区二区在线免费观看 | 97精品超碰一区二区三区 | 午夜国产一区二区 | 成人久久精品 | 亚洲国产美女久久久久 | 99久久99视频只有精品 | 国产精品观看在线亚洲人成网 | 亚洲视频综合在线 | 日韩超碰在线 | 亚洲欧洲久久久 | 中文国产字幕在线观看 | 99精品国产免费久久 | 久久久久久久久久久久久久电影 | 国产成人一区三区 | 91成人免费观看视频 | 亚洲激情小视频 | 91三级视频 | 欧美精品二 | 亚洲精品一区二区三区四区高清 | 欧美日韩p片| 欧美日韩亚洲在线观看 | 久久黄色免费视频 | 亚洲精品中文字幕在线 | 成年人网站免费在线观看 | 天天操天天干天天综合网 | 国产成人亚洲在线观看 | 欧美性春潮 | ,午夜性刺激免费看视频 | 亚洲综合视频在线观看 | 国产精品12 | 日b黄色片| 91日韩在线视频 | 中文区中文字幕免费看 | 久热免费 | 天天看天天干 | 日本久久免费视频 | 日韩在线视频一区 | 不卡精品 | 久久九九影视 | 久久久久久久久久影院 | 不卡视频国产 | 国产精品福利一区 | 亚洲理论在线观看电影 | 超碰在线资源 | 亚洲人成人天堂h久久 | 国产精品久99 | 国产高清视频在线播放一区 | av在线看网站| 国产精品女视频 | 日韩欧美99 | 日韩av成人在线观看 | 麻豆免费视频网站 | 91久久国产综合精品女同国语 | 色av男人的天堂免费在线 | 精品视频www | 欧美日韩在线精品一区二区 | 免费观看完整版无人区 | 91自拍成人 | 少妇bbb| 狠狠干夜夜爱 | 又粗又长又大又爽又黄少妇毛片 | 欧美在线一二区 | www.国产在线视频 | 99在线观看 | 在线国产91 | 婷婷丁香六月天 | 欧美九九九 | 日韩在线电影观看 | 久久国产片 | 欧美一级特黄aaaaaa大片在线观看 | 日韩在线观看小视频 | 国产午夜精品久久久久久久久久 | 成人黄色小说在线观看 | 亚洲欧洲精品久久 | 成人动漫精品一区二区 | 国产激情小视频在线观看 | 久久久久久不卡 | 91资源在线播放 | 日韩理论影院 | 美女黄濒 | 日韩在线大片 | 亚洲精品视频观看 | 成人毛片100免费观看 | 天天干天天做天天爱 | 成人h视频 | 国产亚洲精品无 | 久久久久久久免费观看 | 日日夜夜免费精品 | 美女中文字幕 | 久久精品91久久久久久再现 | 成人影音av| 日韩特黄av | 98久久| 国产精品一区二区三区在线免费观看 | 婷婷丁香综合 | 亚洲午夜久久久久久久久电影网 | 天天色草 | 综合五月婷婷 | 国产九色视频在线观看 | 国产色啪| 九九免费在线观看视频 | 天天草天天干天天射 | 九九综合九九综合 | 久久色网站 | 午夜电影中文字幕 | 人人爽人人爽人人爽学生一级 | 波多野结衣视频一区二区三区 | 狠狠干在线| av最新资源| 免费看一级片 | 亚洲精品视频在线观看免费视频 | 国产精品福利午夜在线观看 | 亚洲劲爆av| 日韩理论片 | 成年人在线免费看 | av网址最新 | 久久www免费视频 | 国产 精品 资源 | 精品91在线 | 亚洲电影黄色 | 91成人网在线观看 | 久久亚洲私人国产精品va | 天天爱天天射 | 在线免费av网 | 7777精品伊人久久久大香线蕉 | 婷婷色av | 色噜噜狠狠色综合中国 | 精品美女在线观看 | 亚洲天天做 | 少妇搡bbb | 亚洲国产中文在线观看 | 欧美黄在线 | 综合激情网 | 亚洲精品永久免费视频 | 国产精品久久久久av免费 | 又湿又紧又大又爽a视频国产 | 在线中文字幕电影 | 亚洲精品视频在线播放 | 777xxx欧美 | 欧美淫视频 | 国产又粗又猛又黄视频 | 波多野结衣在线观看一区 | 国产夫妻自拍av | 韩国av永久免费 | av高清网站在线观看 | 国产精品日韩在线观看 | 国产99色| 久久视频在线视频 | 欧美一二三区在线播放 | 最新av免费在线观看 | 日韩电影中文 | 99高清视频有精品视频 | 五月婷婷深开心 | 热精品| 欧美ⅹxxxxxx| 久久久首页| 国产精品av久久久久久无 | 一区二区三区福利 | 日本精品一二区 | 精品久久久久久亚洲综合网站 | 福利一区二区三区四区 | 天天综合人人 | 久在线观看 | 精品人妖videos欧美人妖 | 婷婷久月 | 日韩高清免费在线 | 色综合久久久久综合体 | 国产精品免费看久久久8精臀av | 国产精品免费成人 | 伊人色播| 久久xx视频 | 免费久久久 | 亚洲精品动漫久久久久 | 国产精品视频免费 | av观看在线观看 | 中文字幕在线观看资源 | 国产精品一区二区久久久久 | 亚洲草视频 | 亚洲春色奇米影视 | 日韩影视在线观看 | 国产五码一区 | 国产99久久精品 | 久久精品欧美一区 | 久久a视频 | 日韩中文字幕a | 性色av一区二区 | 国产又粗又硬又长又爽的视频 | 在线免费观看的av | 中文字幕在线观看2018 | 国产不卡视频在线 | 日韩精品一区二区在线视频 | 国产一二区视频 | 成人在线一区二区三区 | www.天天草 | 国产精品久久久久久久久久直播 | 日女人电影 | 粉嫩一区二区三区粉嫩91 | 中文字幕高清在线播放 | 一区二区三区不卡在线 | 免费网站v | 狠狠狠色| 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 成人久久视频 | 国产精品免费不卡 | 国产亚洲精品久久19p | 最近中文字幕大全中文字幕免费 | 天天爽夜夜爽人人爽曰av | 一区久久久 | 久久久精品网 | 懂色av一区二区在线播放 | 亚洲在线不卡 | 国产一区二区三区免费在线 | 成人av资源在线 | 欧美性黑人 | 98涩涩国产露脸精品国产网 | 国产伦精品一区二区三区在线 | 999亚洲国产996395 | 久久深夜福利免费观看 | 久久艹免费 | 成人av直播 | 91精品视屏 | 久久久免费观看完整版 | 国产黄色精品在线 | 国产精品毛片 | 九九一级片 | 又黄又爽又无遮挡的视频 | 亚洲国产中文在线观看 | 亚洲精品玖玖玖av在线看 | 成人a在线| 97超在线 | 五月开心综合 | 一区二区不卡高清 | 久草视频资源 | 日韩xxx视频| 91精品国产92久久久久 | 天天综合网久久综合网 | 91色吧 | 国产成人精品在线 | 黄色国产精品 | 国产精品剧情在线亚洲 | 999ZYZ玖玖资源站永久 | 免费国产视频 | 欧美日韩视频在线 | 深夜免费小视频 | 九九免费在线看完整版 | 久久久精品在线观看 | 五月天婷亚洲天综合网鲁鲁鲁 | 91porny九色在线播放 | 韩国av免费 | 日日干干 | 国产精品嫩草影视久久久 | 亚洲一区视频在线播放 | 91免费高清在线观看 | 中文字幕日韩国产 | 韩国av一区二区三区 | 久久婷婷一区二区三区 | 色综合天天狠天天透天天伊人 | 欧美性色黄大片在线观看 | 欧美成人精品在线 | 天堂av观看 | 五月激情丁香婷婷 | 韩日精品中文字幕 | 日本黄色大片儿 | 国产一级h | 香蕉视频91 | 日韩在线观看视频在线 | a黄色片 | 国产成人久久av | 国产美女精品久久久 | 青青视频一区 | 欧美日韩二区在线 | 国产精品久久久久久久久软件 | 中文av在线免费观看 | 国产999精品久久久久久 | 天天干天天干天天色 | 亚洲三级av | 国产精品99久久久久人中文网介绍 | 国产精品自在线拍国产 | 国产精品福利无圣光在线一区 | 日韩精品一卡 | 在线电影a | av怡红院 | 精品自拍sae8—视频 | 狠狠干狠狠插 | 午夜狠狠操 | 国产高清在线a视频大全 | www.色婷婷.com| 国产一区二区久久久 | 亚洲无吗视频在线 | 中文字幕在线国产精品 | 国产精品观看在线亚洲人成网 | 日日夜夜天天综合 | 国产视频久 | 精品免费99久久 | 亚洲视频大全 | 97在线资源 | 国产精品k频道 | 999成人精品 | 99久久99久国产黄毛片 | 美女在线免费观看视频 | 日韩精品欧美专区 | 欧美另类老妇 | 精品伦理一区二区三区 | 成人免费视频观看 | 亚洲 欧美 另类人妖 | 日韩最新av在线 | 久久99热这里只有精品 | 国产人免费人成免费视频 | 国产精品久久久久久久久久不蜜月 | 欧美国产日韩一区二区三区 | 亚洲激情视频 | 久久久久国产精品厨房 | 国产精品国产三级国产不产一地 | 国产一区二区在线免费视频 | 国产精品乱码一区二区视频 | 欧美91精品久久久久国产性生爱 | 在线99视频 | 91桃色免费观看 | 久久综合干 | 综合婷婷 | 美女视频a美女大全免费下载蜜臀 | 正在播放国产一区 | 久久久久 免费视频 | 91在线91拍拍在线91 | 亚洲国内精品 | 午夜视频一区二区三区 | 亚洲另类人人澡 | 国产免费成人 | 精品91| 在线看片一区 | 日韩视频中文字幕在线观看 | 亚洲精品9| 久久精品视频4 | 久久韩国免费视频 | 尤物97国产精品久久精品国产 | 91久久久国产精品 | 国产精品一区二区久久 | 欧美日韩高清一区二区三区 | 九九热在线视频 | 国产精品片 | 日韩电影久久 | 欧美精品一级视频 | 久久网站av | 91精品国产一区二区三区 | 日日干美女| av电影在线免费 | 精品1区2区 | 欧美伦理一区二区三区 | 一区二区三区日韩精品 | 国产美女在线观看 | 综合激情久久 | 日韩国产精品一区 | 伊人婷婷色| 51久久成人国产精品麻豆 | 韩日在线一区 | 西西大胆免费视频 | 色在线亚洲 | 狠狠躁天天躁 | 有码中文字幕在线观看 | 色网站免费在线观看 | 波多野结衣亚洲一区二区 | 久久久久欧美精品999 | 国产 精品 资源 | 日韩精品91偷拍在线观看 | 精品久久久久一区二区国产 | 美女免费视频一区二区 | 亚洲电影成人 | 成人免费观看网站 | 色婷婷福利视频 | 五月天激情视频在线观看 | 午夜精品一区二区三区在线播放 | 久久久久国产精品视频 | 国产福利91精品一区 | 中文字幕在线视频网站 | 国产精品久久久久久一二三四五 | 91九色蝌蚪国产 | 亚洲欧美一区二区三区孕妇写真 | 一区二区三区动漫 | 综合色综合色 | 亚洲精品www | 91久久偷偷做嫩草影院 | 在线高清一区 | 久久不卡电影 | 99精品一区二区 | 日本不卡一区二区三区在线观看 | 国产精品久久一区二区三区, | 99视频精品全部免费 在线 | 97成人精品区在线播放 | 又黄又爽又刺激 | 国产高清在线免费观看 | 国产一区视频免费在线观看 | 国产福利91精品 | 精品久久久久久久久久久久久久久久久久 | 最近免费中文字幕大全高清10 | 一区二区精品在线视频 | 夜夜爽夜夜操 | 婷五月激情 | 中文字幕亚洲欧美日韩 | 日韩高清免费观看 | 久久精品久久99精品久久 | 黄色在线网站噜噜噜 | 中文字幕在线视频一区二区三区 | 久久综合给合久久狠狠色 | 丁香午夜婷婷 | 福利一区二区在线 | 91高清免费 | 在线免费av观看 | 日本久久综合网 | 久久久精品综合 | 五月天综合网站 | 亚洲精品女人久久久 | 欧美色精品天天在线观看视频 | 日本中文字幕久久 | 久久视讯 | 午夜av不卡| 国产一级小视频 | 国产一区福利在线 | 欧洲精品一区二区 | 九9热这里真品2 | 久久经典国产视频 | 九热在线 | 免费看的黄色网 | 国产不卡毛片 | 亚洲综合激情五月 | 日本中文字幕一二区观 | 91在线视频播放 | 日韩视频免费观看高清完整版在线 | 欧美日韩精品久久久 | 亚洲三级性片 | 成人性生交大片免费观看网站 | 国产无套精品久久久久久 | 免费观看一区二区 | 日韩在线第一 | 玖玖在线看 | 亚洲激情 在线 | 天天操操操操操 | 国产精品一区二区三区视频免费 | 91一区二区三区在线观看 | 超碰免费av | 成人在线免费视频 | 亚洲国产午夜视频 | 久久伊人色综合 | 成年人免费av | 久久丁香网 | 人人澡人人干 | 美女网站视频免费都是黄 | 91成品人影院 | 欧美精品在线免费 | 二区中文字幕 | 久草在线资源观看 | 丁香婷婷综合五月 | 美女网站色在线观看 | 国产精品一区二区三区视频免费 | 色网址99 | 久久久91精品国产一区二区三区 | 国产最新在线 | 国产色一区 | 国产精品毛片一区视频播 | 在线视频久 | 国产一区二区精品 | 天天操狠狠操夜夜操 | 亚洲v精品 | 超碰在线日本 | 黄色网大全 | 精品福利视频在线观看 | 玖玖爱免费视频 | 免费网站看av片 | 国产色啪 | 99精品国产兔费观看久久99 | 欧美在线1 | 狠狠色丁香久久婷婷综合五月 | 99视频久久 | 亚洲精选久久 | 中文字幕麻豆 | 久久精品网站免费观看 | www色av| 精品国产成人在线 | 精品久久久久久国产 | 国产中文字幕国产 | 免费视频91 | 国产特级毛片aaaaaa高清 | 天天操天天射天天操 | 国产夫妻自拍av | 中文字幕一区二区三区久久 | 国产99久久99热这里精品5 | 又黄又爽又无遮挡免费的网站 | 成年人精品 | 黄色在线观看污 | 免费黄色网址网站 | 午夜久久网 | 亚洲伊人婷婷 | 麻豆精品在线视频 | 天天激情综合 | 欧美一级片在线观看视频 | 伊人久久影视 | 日本高清dvd | 久久精品这里都是精品 | 日韩r级电影在线观看 | 国产福利一区二区三区视频 | 麻豆视频在线 | 成人av中文字幕在线观看 | 日韩av午夜在线观看 | 热热热热热色 | 日韩精品不卡在线 | 日韩二区三区在线观看 | 精品自拍网 | 欧美三级在线播放 | 欧美一级电影免费观看 | 国产成人精品av | 8x成人免费视频 | 日韩av女优视频 | 免费av网站在线看 | 国产精品久久久久久久免费大片 | 在线视频日韩欧美 | 九九在线视频免费观看 | 日本久久免费电影 | 特级毛片爽www免费版 | 激情图片qvod | 黄色影院在线免费观看 | 99精品在线免费视频 | 久久久久久久久久久网站 | 狠狠色丁香婷婷综合 | 手机在线小视频 | 狠狠狠狠狠色综合 | 国产r级在线观看 | 一区二区三区在线观看免费视频 | 香蕉影院在线 | 国产精品综合av一区二区国产馆 | 日韩一级理论片 | 亚洲日本韩国一区二区 | 美女黄视频免费 | 一区二区三区精品久久久 | 成人av av在线 | 国产精品av在线 | 在线a亚洲视频播放在线观看 | 亚州视频在线 | 国产精品久久久久久久久软件 | 国产成人精品国内自产拍免费看 | 色全色在线资源网 | 九色视频网站 | 日本在线中文 | 久草在线视频在线 | av东方在线 | 久久男人免费视频 | 人人讲 | 玖玖999| 久久久免费在线观看 | 免费亚洲视频在线观看 | 深夜视频久久 | 91禁看片| 婷婷在线网 | 日韩av一区二区在线 | 日韩欧美第二页 | 日日干激情五月 | 丁香花在线观看视频在线 | 中文在线a√在线 | 91网站免费观看 | 久久成人高清视频 | 91豆花在线观看 | 少妇bbw撒尿 | 在线 成人 | 一级黄色免费 | 久久免费看片 | 亚洲成人免费在线 | 在线亚洲欧美视频 | 久久免费资源 | 成年人在线播放视频 | 国精产品999国精产品视频 | 人人爽人人片 | 欧美在线视频第一页 | 久久综合婷婷综合 | 亚洲精品www. | 男女拍拍免费视频 | 国产色在线视频 | 成年人视频免费在线 | 久久久69| 精品久久精品久久 | 欧美日韩亚洲第一页 | 久久av不卡| 玖玖玖国产精品 | 91在线超碰 | 日韩久久精品一区二区三区 | av在线免费在线 | 日韩一区二区三区观看 | 中文字幕在线有码 | 96av在线| 久草在线手机观看 | 久久成人一区二区 | 国精产品永久999 | 一级特黄aaa大片在线观看 | 国产原创中文在线 | 天堂va在线观看 | av久久在线 | www日韩精品| av一区二区三区在线 | 亚洲一区av | 色av婷婷| 久草免费福利在线观看 | 色婷婷成人网 | 亚洲成成品网站 | 亚洲电影一区二区 | 免费观看不卡av | 黄色网在线播放 | 黄色国产高清 | 高清美女视频 | 麻豆久久一区 | 最近乱久中文字幕 | 国产免费一区二区三区网站免费 | 国产玖玖精品视频 | 中文字幕 在线看 | 香蕉视频在线观看免费 | 国产成人精品一区在线 | 韩国精品视频在线观看 | 国产色网站 | av蜜桃在线| 中文字幕在线观 | 人人爽人人澡 | 丁香视频免费观看 | 久草资源在线观看 | 成人在线视频你懂的 | 婷婷激情影院 | 国内精品久久久久久久久 | 亚洲九九影院 | 97在线观看免费视频 | 免费看黄的视频 | h网站免费在线观看 | 亚洲日韩中文字幕 | 麻豆91精品视频 | 亚洲影视资源 | 欧美日韩伦理在线 | 国产视频在线观看一区 | www.狠狠色.com| 三级黄色片子 | 国产精品18久久久久久久久久久久 | 国产一区二区精品久久 | 欧美黄色高清 | 在线免费看黄网站 | 国产一区免费视频 | 亚洲精品视频在线观看网站 | 国产精品中文 | 五月婷婷毛片 | 成人欧美亚洲 | 国产免费看 | 亚洲久草网 | 波多野结衣视频一区 | 久久66热这里只有精品 | 日韩三级在线 | 国产精品自产拍在线观看 | 国产 视频 高清 免费 | 婷婷亚洲激情 | 日韩伦理一区二区三区av在线 | 成人毛片一区 | 国产高清在线观看av | 欧美精品亚洲精品 | 久久久久女人精品毛片 | 人人讲下载 | 成人资源在线观看 | 麻豆91在线观看 | 91视频 - 114av | 久久福利综合 | 特级西西444www大胆高清无视频 | 1区2区视频 | 免费看的黄色片 | 伊人久久影视 | 久99久在线视频 | 干综合网 | 亚洲 中文 欧美 日韩vr 在线 | 免费在线观看av的网站 | 香蕉视频久久 | 亚洲精品在线视频观看 | 国产亚洲小视频 | 国产丝袜制服在线 | 国产精品国产三级国产aⅴ入口 | 天天干天天干天天干天天干天天干天天干 | 五月天国产| 91亚洲精品在线 | 一区二区三区四区免费视频 | 手机在线中文字幕 | 亚洲女欲精品久久久久久久18 | 国产涩涩网站 | 日韩 在线| 久热电影| 超碰免费在线公开 | 久久精品播放 | 91手机视频在线 | 99久久国产免费看 | 亚洲电影影音先锋 | 国产精品99久久久久久人免费 | 国产日本亚洲 | 午夜av在线电影 | 国产成人精品免费在线观看 | 在线国产91| 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 99热精品免费观看 | 久久精品电影 | 天天操天天爱天天干 | 在线黄av | 99中文字幕 | 久草在线资源观看 | 久久精品福利 | 91尤物国产尤物福利在线播放 | 国产99黄| 一本一道久久a久久精品蜜桃 | 久久久久久久99精品免费观看 | 欧美极品少妇xbxb性爽爽视频 | 国产精品久久久久久久久大全 | 国产一区二区在线播放视频 | 天堂av观看 | 免费日韩三级 | 国产一区二区在线影院 | 亚洲精品午夜久久久久久久久久久 | 综合网伊人 | 99热9| 成人一区二区在线 | 成年人在线看片 | 国产粉嫩在线 | 中文字幕在线观看av | 亚洲精品国产综合99久久夜夜嗨 | 欧美一级性| 国产精品色在线 | 新版资源中文在线观看 | 久久久香蕉视频 | 一区二区三区日韩精品 | 四虎国产精品免费 | 国产精品成久久久久三级 | 亚洲美女在线一区 | free. 性欧美.com| 国产精品刺激对白麻豆99 | 日韩欧美在线观看 | 人人玩人人添人人澡超碰 | 久久成人综合视频 | 欧美精品中文字幕亚洲专区 | 久久精品免费播放 | 中文字幕在线免费观看视频 | 欧美成人在线网站 | 亚洲二区精品 | 国产精品去看片 | 国产一区二区网址 | 玖玖爱免费视频 | 国产中文字幕国产 | 国产一区视频在线 | 成片免费观看视频999 | 五月婷婷色丁香 | 色www.| 免费在线观看黄网站 | 天天操天天爱天天爽 | 91传媒91久久久 | 久久久不卡影院 | 狠狠干我| 97av精品| 欧美日韩亚洲在线 | 久久久久久久久久亚洲精品 | 香蕉视频免费在线播放 | 九九电影在线 | 久久激情五月激情 | 四虎成人精品永久免费av九九 | 91午夜精品 | 奇米四色影狠狠爱7777 | 激情五月开心 | 免费观看的黄色 | 精品在线一区二区 | 欧美日韩激情视频8区 | 91av视频播放 | 久久久久亚洲精品男人的天堂 | 伊人资源视频在线 | 国产 在线观看 | 国产成人精品久 | 国产一区成人在线 | 久久99久久99免费视频 | 亚洲一区二区三区四区精品 | 久久97久久97精品免视看 | 在线观看中文字幕dvd播放 | 欧美aa一级 | 9在线观看免费高清完整版在线观看明 | 丁香花在线观看免费完整版视频 | 欧美日韩国产精品一区二区亚洲 | 黄色av网站在线免费观看 | 亚洲精品视频免费观看 | 伊人天堂网 | 亚洲综合色丁香婷婷六月图片 | 欧美精品v国产精品v日韩精品 | 亚洲精品自拍视频在线观看 | 国产精品成人一区二区三区吃奶 | 婷婷久月 | 国产精品美女在线 | 国产精品黑丝在线观看 | 日韩精品在线免费观看 | 九色精品免费永久在线 | 亚洲人成在线观看 | 亚洲欧美日韩在线看 | 国产正在播放 | 一区二区成人国产精品 | 国产午夜麻豆影院在线观看 | 色99色| 国产一区欧美在线 | 福利二区视频 | 色综合天 | 三上悠亚一区二区在线观看 | 深夜男人影院 | 亚洲天天干 | 欧美日韩国产精品久久 | 欧美成人va | 国产综合香蕉五月婷在线 | 一区二区三区av在线 | 久久久午夜剧场 | 在线观看资源 | 超碰人人草人人 | 国产精品美女久久久久久免费 | 色综合天天色综合 | 日本精品视频免费 | 国产在线91在线电影 | 中文字幕亚洲欧美 | 久久影视精品 | 一级特黄aaa大片在线观看 | 国产黄a三级 | 亚洲性少妇性猛交wwww乱大交 | 在线国产一区二区三区 | 波多野结衣电影久久 | 97操操| 免费看的黄色 | 午夜精品久久久久99热app | 开心丁香婷婷深爱五月 | 国产无遮挡又黄又爽馒头漫画 | 日韩1页| 97在线视频免费看 | 精品uu | 日韩免费一区二区三区 | 一区二区三区高清 | 亚洲欧美日本一区二区三区 | 日韩一区二区三区不卡 | 欧美日韩不卡一区 | 97久久精品午夜一区二区 | 欧美日韩观看 | 国产美女精品视频免费观看 |