我刚刚开始学习React和JavaScript。在我阅读了留档和教程之后,我看了一下示例项目,并试图整理我还没有得到的内容。
然后我看到有一些函数是在render()
函数内部定义的,还有一些函数是在render()
函数外部定义的。
例如,在渲染()
之外:
handleClick(e) {
e.preventDefault();
e.target.parentElement.classList.toggle('open');
}
和内部render()。。。
const divider = (divider, key) => {
const classes = classNames( 'divider', divider.class);
return (<li key={key} className={ classes }></li>);
};
为什么它们看起来如此不同,为什么你想在的渲染()
内部和外部有一些函数?
编辑:
render()
之外的函数的另一个示例:
hideMobile() {
if (document.body.classList.contains('sidebar-mobile-show')) {
document.body.classList.toggle('sidebar-mobile-show')
}
}
EDIT2:在另一个线程中,有人回答说,如果函数背后的逻辑很重,那么它应该在render()之外。但无论如何,为什么要在render()中包含函数呢?
除此之外,handleClark
是为每个Object/Component创建并可访问的函数,而划分
是一个本地范围的函数,它们的功能可以几乎相同。然而,将在每个渲染上创建一个新函数,这可能会对以后的性能产生影响,而为一个定义的组件(对象)创建一次handleClark
。
来自官方网站上的示例:
首先,如果我们想在一开始就构建一个时钟,这就是我们试图用无状态函数对象创建一个面向对象的、可维护的因素的组件的方式。
function Clock(props) {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {props.date.toLocaleTimeString()}.</h2>
</div>
);
}
function tick() {
ReactDOM.render(
<Clock date={new Date()} />,
document.getElementById('root')
);
}
setInterval(tick, 1000);
引用doc的话
使时钟组件真正可重用和封装。它将设置自己的计时器并每秒更新自己。
... 理想情况下,我们想写一次,让时钟自动更新。。。
这就是React的精神,我们想将这个函数对象转换成一个类,它可以维护自身,所以现在我们在中涉及到render()
,更具体地说,我们在中涉及到有状态组件:
Add a single empty method to it called render()
...
Clock is now defined as a class rather than a function.
然后我们得到:
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
this.clockCore = this.clockCore.bind(this);
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
tick() {
this.setState({
date: new Date()
});
}
clockCore() {
return (<div>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>);
}
render() {
return this.clockCore();
}
}
如您所知,如果组件的状态需要通过setState()
刷新,则会再次触发render()。
使现代化
在我看来,没有必要在
render()
中定义函数。为了说明这一点,我对上面的原始示例做了一些修改。
根据您提供的示例,分频器的用法可能如下:
const divider = (divider, key) => {
const classes = classNames( 'divider', divider.class);
return (<li key={key} className={ classes }></li>);
};
return (<ul>{this.state.dividerList?
this.state.dividerList.forEach(divider) : null}</ul>);
我认为这样做的原因只是为了可维护性,可能有人希望在
render()
中创建所有DOM代码,以便在返回的DOM结构非常复杂(而且arrow函数是轻量级的)时轻松跟踪,但正如我所说的,这是主观的,它确实可以在外部定义。
在这种情况下,我通常会执行下面的操作,您提供的功能似乎更为优雅,但如果您在
render()
之外定义该函数,事情就会变得让我分心。
let dividers = [];
if (this.state.dividerList) {
this.state.dividerList.forEach((divider, key) => {
let classes = classNames( 'divider', divider.class);
dividers.push((<li key={key} className={ classes }></li>));
});
}
return (<ul>{dividers}</ul>);
所以,您提供的另一个针对DOM操作特性的函数是完全正确的,可以在外部定义。
render()
在状态每次更改时都被调用。因此,每次
状态更改时,保存在渲染函数中的每个函数都将被创建为新函数。这意味着每次react重新渲染时都会新创建
分隔符。
handleClick
是一个普通的对象函数。
在
render
函数中编写的函数通常是那些处理组件重新招标的函数。
问题内容: 我正在尝试学习reactjs并且有一些不确定性。我指的是react DOCS和其他一些教程,我看到函数是在render函数和类内部编写的。我们应该在render函数内部做些什么反应? 第一种方式 第二路 这两种方法都有效。但是我想知道什么是最好的方法吗?最重要的是,我想知道我可以在render函数中做什么事情。 谢谢。 问题答案: 我认为这最终是您的选择,但我个人更喜欢仅将功能放在re
我正在寻找一种方法,在一个微服务中有一个用于公共访问的应用编程接口,另一个用于其他私有服务的内部应用编程接口。 当然,这在不同的URL中是可能的。但看起来好像合并了swagger/open api描述页面。 公共和私有API应该有一个单独的招摇页面。来自互联网的人不能看到内部API描述。只有公共的。 有想法吗?
问题内容: 这是我之前的问题的后续工作,但是如果我在其中的映射如何在React的render()方法中调用函数。 示例(此代码在extended的类内): 无论我尝试什么,我总是最终得到“ this.getItemInfo()不是一个函数”。 我在函数内部进行了on操作,实际上是在引用Window对象,但是我似乎找不到改变它的方法。 我累了: 定义为函数getItemInfo(){..} 作为第二
问题内容: 我正在尝试使用docker-compose启动kafka服务,并且应该可以在docker内部和外部进行访问。因此,应该在内部和外部设置合适的广告客户: 问题是,当我尝试从群集外部进行连接时,节点名称不是127.0.0.1,而是内部主机名: 这不是KAFKA_ADVERTISED_LISTENERS和KAFKA_LISTENERS处理这种情况的目的吗?我尝试设置KAFKA_ADVERTI
本文向大家介绍hive内部表和外部表的区别相关面试题,主要包含被问及hive内部表和外部表的区别时的应答技巧和注意事项,需要的朋友参考一下 解答: 内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除 外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。
我试图运行一个简单的mapdb示例,但出现了以下错误: 我的班级: 我的pomx.xml 我跑得很快-