I. Primeiro Showcase
Veja a caneta reagir-tabs por Wang Chao ( @charleyw ) em CodePen .
Em segundo lugar, como conseguir
Desde a escrita Reagir, então deve ser um componente, primeiro pense em como você usar esse componente, que é a interface deste componente é como.
<TabsControl>
<Tab name="red">
<div className="red"/>
</Tab>
<Tab name="blue">
<div className="blue"/>
</Tab>
<Tab name="yellow">
<div className="yellow"/>
</Tab>
</TabsControl>
Este TabsControl
é um elemento pai que controla Tab
como o interruptor Tab
é usado para embrulhar o verdadeiro conteúdo a ser exibido, sua name
propriedade é o nome da guia será exibida na guia barra de título.
Em terceiro lugar, criar elementos básicos
De acordo com as idéias anteriores, Tab
definiu uma série de guias, precisamos da barra de título e conteúdo com base nesses guia de compilação personalizada.
1. atravessando this.props.children
barra de título gerado dinamicamente
this.props.children
Reagir é uma propriedade interna para a obtenção de elementos filhos. Porque pode haver um sub-elemento ou matriz de objectos, de modo Reagir proporciona um método de processamento suplementar para a travessia de crianças:React.Children.map
Assim, o título gerado dinamicamente código pode ser assim:
React.Children.map(this.props.children, (element, index) => {
return (<div className="tab-title-item">{element.props.name}</div>)
2. Usando o mesmo método para gerar etiquetas de conteúdo da página
React.Children.map(this.props.children, element => {
return (element)
})
Juntos é TabsControl
a realização:
let TabsControl = React.createClass({
render: function () {
let that = this;
let {baseWidth} = this.props;
let childrenLength = this.props.children.length;
return (
<div>
<nav className="tab-title-items">
{React.Children.map(this.props.children, (element, index) => {
return (<div className="tab-title-item">{element.props.name}</div>)
})}
</nav>
<div className="tab-content-items">
{React.Children.map(this.props.children, element => {
return (element)
})}
</div>
</div>
)
}
});
Além de alguns css você pode ver um protótipo da guia.
Em terceiro lugar, para alcançar um switcher guia
Aqui o conceito mais importante reagir a emergiu state
, state
é um Javascript-Object, que é usado para representar o estado atual de montagem, se TabsControl
, por exemplo, então ele state
pode estar presente no estado ativo número guia (claro, se você quiser então você pode salvar a guia conteúdo).
Reagir fornece uma maneira setState()
para que você possa mudar o state
valor. Cada chamada setState()
irá acionar o componente render()
, esse componente irá representar atualizações DOM para state
estado representa.
Portanto, a chave para mudar o seguinte:
state
Salve o número de guia ativo no momentoClique no título quando a chamada
setState()
para atualizar o número da página aba ativarender()
Ao navegar othis.props.children
tempo do número estate
do número de elementos marca idênticaactive
Com não-css
active
elementos escondidos
Assim, o código é a seguinte:
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 (
<div>
<nav className="tab-title-items">
{React.Children.map(this.props.children, (element, index) => {
return (<div onClick={() => {this.setState({currentIndex: index})}} className={that.getTitleItemCssClasses(index)}>{element.props.name}</div>)
})}
</nav>
<div className="tab-content-items">
{React.Children.map(this.props.children, (element, index) => {
return (<div className={that.getContentItemCssClasses(index)}>{element}</div>)
})}
</div>
</div>
)
}
});
getInitialState
: Componente estado de inicialização, o padrão é o primeiro guia está ativo. getTitleItemCssClasses
: Determinar o rótulo atual e state
o número de etiqueta, se tiver sido salvo, ele é identificado como active
. getContentItemCssClasses
: Mesmo que acima. onClick={() => {this.setState({currentIndex: index})}}
: Título Tab clique bound evento, cada atualização clique state
para salvar o número de guia, em seguida, acionar o render()
guia método de redesenho.
IV Resumo
O resultado final de uma série de operações do acima são necessários render()
para ser reflectida, de modo que o ponto chave é a forma render()
de usar o state
DOM gerados de forma dinâmica.
A próxima melhoria
A implementação pode deslizar a guia