摘要:四總結(jié)上面一系列的操作最終的結(jié)果都需要用來(lái)反應(yīng)出來(lái),所以關(guān)鍵點(diǎn)是如何在中使用來(lái)動(dòng)態(tài)生成接下來(lái)的改進(jìn)實(shí)現(xiàn)可以滑動(dòng)的標(biāo)簽頁(yè)
一、首先是Showcase
See the Pen react-tabs by Wang Chao (@charleyw) on CodePen.
二、如何實(shí)現(xiàn)既然用React寫,那么它就必然是一個(gè)組件,首先考慮你怎么使用這個(gè)組件,也就是這個(gè)組件的接口是怎么樣的。
這個(gè)TabsControl作為父組件,它來(lái)控制Tab的如何切換,Tab是用來(lái)包裹真正要顯示的內(nèi)容的,它的name屬性是這個(gè)標(biāo)簽頁(yè)的名字,會(huì)被顯示在標(biāo)簽頁(yè)的標(biāo)題欄上。
三、創(chuàng)建基本元素按照之前的想法,我們用Tab定義了很多個(gè)標(biāo)簽頁(yè),我們需要根據(jù)這些定義生成標(biāo)簽頁(yè)的標(biāo)題欄和內(nèi)容。
1. 遍歷this.props.children動(dòng)態(tài)生成標(biāo)題欄this.props.children是React內(nèi)建的一個(gè)屬性,用來(lái)獲取組件的子元素。因?yàn)樽釉赜锌赡苁荗bject或者Array,所以React提供了一些處理children的輔助方法用來(lái)遍歷:React.Children.map
那么動(dòng)態(tài)生成標(biāo)題的代碼可能是這樣子的:
React.Children.map(this.props.children, (element, index) => { return (2. 再用同樣方法生成標(biāo)簽頁(yè)內(nèi)容{element.props.name})
React.Children.map(this.props.children, element => { return (element) })
組合起來(lái)就是TabsControl的實(shí)現(xiàn):
let TabsControl = React.createClass({ render: function () { let that = this; let {baseWidth} = this.props; let childrenLength = this.props.children.length; return () } });{React.Children.map(this.props.children, element => { return (element) })}
加上一些css就能看到一個(gè)標(biāo)簽頁(yè)的雛形了。
三、實(shí)現(xiàn)標(biāo)簽頁(yè)切換這里要出現(xiàn)React最重要的概念了state,state是一個(gè)Javascript的Object,它是用來(lái)表示組件的當(dāng)前狀態(tài)的,如果用TabsControl舉例的話,它的state可以是當(dāng)前處于激活狀態(tài)的標(biāo)簽頁(yè)編號(hào)(當(dāng)然,如果你想的話也可以保存標(biāo)簽頁(yè)的內(nèi)容)。
React提供了一個(gè)方法setState()讓你可以改變state的值。每次調(diào)用setState()都會(huì)觸發(fā)組件的render(),也就是說(shuō)會(huì)把組件所代表的DOM更新到state所代表的狀態(tài)。
所以實(shí)現(xiàn)切換的關(guān)鍵如下:
state保存當(dāng)前處于激活狀態(tài)的標(biāo)簽頁(yè)的編號(hào)
點(diǎn)擊標(biāo)題的時(shí)候調(diào)用setState()更新激活的標(biāo)簽頁(yè)編號(hào)
render()的時(shí)候,在遍歷this.props.children的時(shí)候把編號(hào)與state中編號(hào)一致的元素標(biāo)記為active
用css將非active的元素隱藏起來(lái)
所以代碼是這樣的:
let TabsControl = React.createClass({ getInitialState: function(){ return {currentIndex: 0} }, getTitleItemCssClasses: function(index){ return index === this.state.currentIndex ? "tab-title-item active" : "tab-title-item"; }, getContentItemCssClasses: function(index){ return index === this.state.currentIndex ? "tab-content-item active" : "tab-content-item"; }, render: function(){ let that = this; let {baseWidth} = this.props; let childrenLength = this.props.children.length; return () } });{React.Children.map(this.props.children, (element, index) => { return ({element}) })}
getInitialState:是組件的初始化狀態(tài),默認(rèn)是第一個(gè)標(biāo)簽頁(yè)處于激活狀態(tài)。
getTitleItemCssClasses:判斷當(dāng)前標(biāo)簽和state中保存的標(biāo)簽編號(hào)是否一直,是則標(biāo)識(shí)為active。
getContentItemCssClasses:同上。
onClick={() => {this.setState({currentIndex: index})}}:標(biāo)簽頁(yè)標(biāo)題綁定了點(diǎn)擊事件,每次點(diǎn)擊都會(huì)更新state保存的標(biāo)簽頁(yè)編號(hào),然后觸發(fā)render()方法重繪標(biāo)簽頁(yè)。
上面一系列的操作最終的結(jié)果都需要用render()來(lái)反應(yīng)出來(lái),所以關(guān)鍵點(diǎn)是如何在render()中使用state來(lái)動(dòng)態(tài)生成DOM.
接下來(lái)的改進(jìn)實(shí)現(xiàn)可以滑動(dòng)的標(biāo)簽頁(yè)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/49703.html
摘要:四總結(jié)上面一系列的操作最終的結(jié)果都需要用來(lái)反應(yīng)出來(lái),所以關(guān)鍵點(diǎn)是如何在中使用來(lái)動(dòng)態(tài)生成接下來(lái)的改進(jìn)實(shí)現(xiàn)可以滑動(dòng)的標(biāo)簽頁(yè) 一、首先是Showcase See the Pen react-tabs by Wang Chao (@charleyw) on CodePen. 二、如何實(shí)現(xiàn) 既然用React寫,那么它就必然是一個(gè)組件,首先考慮你怎么使用這個(gè)組件,也就是這個(gè)組件的接口是怎么樣的。 ...
摘要:官方文檔中文文檔基本使用注意一定要在根目錄的中聲明,要不然點(diǎn)擊任何鏈接都無(wú)法跳轉(zhuǎn)。官方文檔中文文檔簡(jiǎn)單的來(lái)說(shuō),每一次的修改狀態(tài)都需要觸發(fā),然而其實(shí)項(xiàng)目中我現(xiàn)在還沒用到修改數(shù)據(jù)。。。 學(xué)習(xí) React 的過程中實(shí)現(xiàn)了一個(gè)個(gè)人主頁(yè),沒有復(fù)雜的實(shí)現(xiàn)和操作,適合入門 ~ 原文地址:https://github.com/axuebin/react-blog/issues/17 這個(gè)項(xiàng)目其實(shí)功能...
摘要:最新一直在看關(guān)于和路由這塊的知識(shí),最終發(fā)現(xiàn)這些路由框架的模塊功能的實(shí)現(xiàn)都是基于瀏覽器原生路由的。在瀏覽器中實(shí)現(xiàn)前端路由主要有兩種方式一個(gè)是我們常用的,另一個(gè)是提供的。該對(duì)象的和分別表示的各個(gè)部分,它們因此被稱為分解屬性。 最新一直在看關(guān)于 Vue 和 React 路由這塊的知識(shí),最終發(fā)現(xiàn)這些路由框架的模塊功能的實(shí)現(xiàn)都是基于瀏覽器原生路由 API?的。本著追根溯源的初心,于是就想著將瀏覽...
摘要:最新一直在看關(guān)于和路由這塊的知識(shí),最終發(fā)現(xiàn)這些路由框架的模塊功能的實(shí)現(xiàn)都是基于瀏覽器原生路由的。在瀏覽器中實(shí)現(xiàn)前端路由主要有兩種方式一個(gè)是我們常用的,另一個(gè)是提供的。該對(duì)象的和分別表示的各個(gè)部分,它們因此被稱為分解屬性。 最新一直在看關(guān)于 Vue 和 React 路由這塊的知識(shí),最終發(fā)現(xiàn)這些路由框架的模塊功能的實(shí)現(xiàn)都是基于瀏覽器原生路由 API?的。本著追根溯源的初心,于是就想著將瀏覽...
閱讀 3672·2021-09-30 09:59
閱讀 2342·2021-09-13 10:34
閱讀 585·2019-08-30 12:58
閱讀 1514·2019-08-29 18:42
閱讀 2210·2019-08-26 13:44
閱讀 2932·2019-08-23 18:12
閱讀 3326·2019-08-23 15:10
閱讀 1633·2019-08-23 14:37