React.js開發入門教學(10)-動畫特效
在原本我們使用的CSS特效,在React上被整合的更好使用了。為什麼這麼說?因為我們知道
原本的寫法都是針對某個class或是id、name等等去做觸發事件或是變換的特效。也就是會
要針對某個標籤塞一堆class進去。在React中我們可以利用addon的CSSTransitionGroup
來幫我們做這件事情,也就是說不需要我們自己寫一堆class名稱就可以辦到!首先我們先把原
本HTML中預先載入的react.js換成帶有addon的版本
<script src="https://unpkg.com/react@15/dist/react.js"></script>
換成
<script src="https://unpkg.com/react@15/dist/react-with-addons.js"></script>
接著我們寫上我們希望的CSS特效
//這是定義進入特效時的效果
.example-enter {
opacity: 0;
}
//這是定義特效執行後的效果
.example-enter.example-enter-active {
opacity: 1;
transition: opacity 1500ms ease-in;
}
//這是定義離開特效時的效果
.example-leave {
opacity: 1;
}
//這是定義離開特效執行後的效果
.example-leave.example-leave-active {
opacity: 0;
transition: opacity 1ms ease-in;
}
//這是定義預設載入時的效果
.example-appear {
opacity: 0;
}
//這是定義預設載入執行後的效果
.example-appear.example-appear-active {
opacity: 1;
transition: opacity 1s ease-in;
}
然後寫下以下代碼
//不要忘記要先include這項addon
var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup;
class Anime extends React.Component{
constructor(props) {
super(props)
this.state = {
checked: false,
text: '初始值'
}
}
check_change(Event) {
if(Event.target.checked) {
this.setState({checked: Event.target.checked, text: '出現了'})
} else {
this.setState({checked: Event.target.checked, text: ''})
}
}
render() {
//注意!這裡h1的KEY屬性一定要給React是根據key的變化來判定什麼時候進行動畫特效的
return(
<div>
<input id="123" name="recipient-name" type="checkbox" checked={this.state.checked} onChange={this.check_change.bind(this)}/><label htmlFor="123">變換</label><br/>
<ReactCSSTransitionGroup
transitionName="example"
transitionAppear={true}
transitionAppearTimeout={1500}
transitionEnter={true}
transitionEnterTimeout={1500}
transitionLeave={true}
transitionLeaveTimeout={300}>
<h1 key={this.state.checked}>{this.state.text}</h1>
</ReactCSSTransitionGroup>
</div>
)
}
}
ReactDOM.render(
<Anime />,
document.getElementById('test')
)
我們可以看到ReactCSSTransitionGroup標籤中有很多屬性,其實看名稱就知道是做什麼的,比較要注意的一點是transitionName
屬性對應到的是你CSS中的名稱,也就是你這裡名稱為「test」的時候,那你css表應該寫成「.test-enter」!這樣就可以
對我們要的標籤做css特效變化啦!是不是比原本jQuery要寫什麼$(‘test’).addClass()來的直覺一點呢?
不過眼尖的人應該會發現,當你每次在執行變換的時候,其實,會有一小段時間原有的標籤會停留在畫面上,導致變化起來沒那麼好看,
解決方法我還在找…不過入門學習就到此為止啦!接下來我要邁向ReactNative來學習寫APP了!:P