React踩坑了

起步就踩坑

可给我牛逼坏了

上来在入口文件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打印出来,会发现thisnull或者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-contentdiv 元素当中。

这种嵌套的内容成为了 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>
)
}
}

React踩坑了
https://moewang0321.github.io/2019/11/27/2019-11-27-React踩坑!/
作者
Moe Wang
发布于
2019年11月27日
许可协议