起步就踩坑
可给我牛逼坏了
上来在入口文件index.js里写了一段render()代码,然后看到了美丽的红色:)
{:width=”600px” height=”380px”}
疯狂百度,最后自己发现了……得把语言的类型改一下
{:width=”600px” height=”380px”}
好了……
关于this
1 2 3 4 5 6 7 8 9 10 11
| class Title extends Component { handleClickOnTitle (e) { console.log(e.target.innerHTML) }
render () { return ( <h1 onClick={this.handleClickOnTitle}>React 小书</h1> ) } }
|
一般在类的实例方法里的this
指的是实例本身,但是你在上面的handleClickOnTitle
中把this
打印出来,会发现this
是null
或者undefined
1 2 3 4 5
| …… handleClickOnTitle(e) { console.log(this) // --> null or undefined } ……
|
react中调用你传给他的方法的时候,不是通过对象方法的方式调用(this.handleClickOnTitle)
,而是通过函数调用,所以事件监听函数内并不能通过this
获取到实例
如果要在事件函数中使用当前实例,可以用Bind
1 2 3 4 5 6 7 8 9 10 11
| class Title extends Component { handleClickOnTitle (e) { console.log(this) }
render () { return ( <h1 onClick={this.handleClickOnTitle.bind(this)}>React 小书</h1> ) } }
|
关于props.children
react中容器类组件和props.children
很多时候能解决很多问题
有需求类似
正常写是可以写出这样的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Card extends Component { render () { return ( <div className='card'> <div className='card-content'> {this.props.content} </div> </div> ) } }
ReactDOM.render( <Card content={ <div> <h2>React.js 小书</h2> <div>开源、免费、专业、简单</div> 订阅:<input /> </div> } />, document.getElementById('root') )
|
但是这样很乱而且不好维护,如果card能变成下面这样
1 2 3 4 5 6 7 8
| ReactDOM.render( <Card> <h2>React.js 小书</h2> <div>开源、免费、专业、简单</div> 订阅:<input /> </Card>, document.getElementById('root') )
|
如果组件标签能像html一样写内嵌的结构……?是吧
react提供了props.children
来实现这种想法,我们打印一下props.children
会发现他其实是一个数组
react就是把我们嵌套的JSX元素一个个放到数组中,然后通过这个方法传给Card
由于 JSX 会把插入表达式里面数组中的 JSX 一个个罗列下来显示。所以其实就相当于在 Card
中嵌套了什么 JSX 结构,都会显示在 Card
的类名为 card-content
的 div
元素当中。
这种嵌套的内容成为了 props.children
数组的机制使得我们编写组件变得非常的灵活,我们甚至可以在组件内部把数组中的 JSX 元素安置在不同的地方:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Layout extends Component { render () { return ( <div className='two-cols-layout'> <div className='sidebar'> {this.props.children[0]} <!-->h2<--> </div> <div className='main'> {this.props.children[1]} <!-->div<--> </div> </div> ) } }
|