在 React 中,我们可以通过创建不同的组件封装不同的行为,然后根据应用的状态渲染对应状态下的部分内容
// 定义组件封装登陆行为
class SignIn extends React.Component {
constructor(props) {
super(props)
}
render() {
return Please Sign In
}
}
// 定义组件封装注册行为
class SignUp extends React.Component {
constructor(props) {
super(props)
}
render() {
return Please Sign Up
}
}
// 根据用户是否已经登陆决定渲染哪个组件
class Greeting extends React.Component {
constructor(props) {
super(props)
}
render() {
if (this.props.isSignUp) {
return
} else {
return
}
}
}
ReactDOM.render(
,
document.getElementById('app')
);
在某些情况下,我们希望可以隐藏元素,这时候我们需要让 render()
返回 null
即可
class Warning extends React.Component {
constructor(props) {
super(props)
}
render() {
if (this.props.isWaring) {
return Waring!
} else {
return null
}
}
}
ReactDOM.render(
,
document.getElementById('app')
);
我们可以使用变量储存元素,使得我们可以有条件地渲染组件的一部分
class LoginControl extends React.Component {
constructor(props) {
// 1、传递 props
super(props);
// 2、初始 state
this.state = {isLoggedIn: false};
// 3、为事件处理函数绑定组件实例
this.handleLoginClick = this.handleLoginClick.bind(this);
this.handleLogoutClick = this.handleLogoutClick.bind(this);
}
handleLoginClick() {
this.setState({isLoggedIn: true});
}
handleLogoutClick() {
this.setState({isLoggedIn: false});
}
render() {
// 使用变量根据条件储存元素
let greeting;
let button;
if (this.state.isLoggedIn) {
greeting = Now you are logged in!
;
button = ;
} else {
greeting = Please log in!
;
button = ;
}
return (
{greeting}
{button}
);
}
}
ReactDOM.render(
,
document.getElementById('app')
);
在 React 组件中,我们可以通过 map()
方法快速渲染列表元素,我们先来看一个小例子
Demo
在上面的例子中,虽然可以正常显示元素,但是当我们打开控制台的时候,会看到有一条警告信息
Warning: Each child in a list should have a unique "key" prop.
我们可以通过给每个列表元素分配一个 key
属性来解决上面这个问题
class ItemList extends React.Component {
render() {
const numbers = [1, 2, 3, 4, 5]
const items = numbers.map((number)=>(
{ number }
))
return (
{ items }
)
}
}
一个元素的 key 最好是这个元素在列表中拥有的独一无二的字符串,万不得已的情况下也可以使用元素索引
class ItemList extends React.Component {
render() {
const numbers = [1, 2, 3, 4, 5]
const items = numbers.map((number, index)=>(
{ number }
))
return (
{ items }
)
}
}
如果列表项目的顺序会发生改变,那么不建议使用索引作为 key,因为这样可能会导致性能问题,甚至会引起组件状态的问题
在默认的情况下,即我们没有显式指定 key 时,React 将使用索引作为列表项目的 key
除了可以使用 map()
方法渲染多个元素,还可以使用 map()
渲染多个组件,请看一个例子
class TodoItem extends React.Component {
constructor(props) {
super(props)
}
render() {
return ( { this.props.title }
)
}
}
class TodoList extends React.Component {
constructor(props) {
super(props)
this.state = {
itemList: [
{id: 0, title: 'Say Hello', isDone: true},
{id: 1, title: 'Say Goodbye', isDone: false}
]
}
}
render() {
const todoItemList = this.state.itemList.map((item) => {
if (!item.isDone) {
return ( )
}
})
return ( { todoItemList }
)
}
}
ReactDOM.render(
,
document.getElementById('app')
)
【 阅读更多 React 系列文章,请看 React学习笔记 】