kir*_*uga 19 javascript frameworks class reactjs
我的根组件中有这样的render()方法:
render: function() {
return (
<div className="question">
<QuestionA question={this.props.question} author={this.props.author}/>
<QuestionB yes={this.state.yes} no={this.state.no} />
<div className="question-side-switcher" onClick={this.handleSideChanging}></div>
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
我想在用户点击按钮时在QuestionA和QuestionB组件之间切换'active'类.我怎样才能做到这一点?请记住,QuestionA和QuestionB在其render()方法中设置了自己的classNames.例如QuestionB的render():
render: function() {
return (
<section className="question-b-container">
...
</section>
);
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*ley 22
有几种方法可以解决这个问题.
如果您希望父级控制其他类,您只需将其传递给子组件并让它们将其添加到现有的类名(JSFiddle演示):
var QuestionA = React.createClass({
render: function() {
return <section className={this.props.className + " question-a-container"}>Section A</section>;
}
});
var QuestionB = React.createClass({
render: function() {
return <section className={this.props.className + " question-b-container"}>Section B</section>;
}
});
var Root = React.createClass({
getInitialState: function() {
return { question: 'a' };
},
render: function() {
var qAclassName = this.state.question === 'a' ? 'active' : '';
var qBclassName = this.state.question === 'b' ? 'active' : '';
return (
<div className="question">
<QuestionA className={qAclassName} />
<QuestionB className={qBclassName} />
<div className="question-side-switcher" onClick={this.handleSideChanging}>Change</div>
</div>
);
},
handleSideChanging: function() {
this.setState({question: this.state.question === 'a' ? 'b' : 'a' });
}
});
Run Code Online (Sandbox Code Playgroud)
但是,让孩子管理类名可能更有意义,只需发送一些数据以指示是否应该设置其活动类(JSFiddle演示):
// Using classSet to more easily create conditional class names;
// see http://facebook.github.io/react/docs/class-name-manipulation.html
var cx = React.addons.classSet;
var QuestionA = React.createClass({
render: function() {
// always set "question-a-container";
// set "active" if we got a truthy prop named `active`
var className = cx({
"question-a-container": true,
"active": this.props.active
});
return <section className={className}>Section A</section>;
}
});
var QuestionB = React.createClass({
render: function() {
// always set "question-b-container";
// set "active" if we got a truthy prop named `active`
var className = cx({
"question-b-container": true,
"active": this.props.active
});
return <section className={className}>Section B</section>;
}
});
var Root = React.createClass({
getInitialState: function() {
return { question: 'a' };
},
render: function() {
return (
<div className="question">
{/* For each question, compare to state to see if it's active. */}
<QuestionA active={this.state.question === 'a'} />
<QuestionB active={this.state.question === 'b'} />
<div className="question-side-switcher" onClick={this.handleSideChanging}>Change</div>
</div>
);
},
handleSideChanging: function() {
this.setState({question: this.state.question === 'a' ? 'b' : 'a' });
}
});
Run Code Online (Sandbox Code Playgroud)
正如Brian Voelker在评论中提到的那样,现在在React中操作类的官方方法是使用classnames实用程序.
你可以定义你的两个组件,如下所示:
import React, { Component } from 'react'
import classNames from 'classnames'
class QuestionA extends Component {
render () {
const { active } = this.props
const cx = classNames('question-a-container', { active })
return (
<section className={cx}></section>
)
}
}
Run Code Online (Sandbox Code Playgroud)
并简单地传递给他们一个active道具来切换同名班级.