当前位置: 首页 > 知识库问答 >
问题:

render()内部和外部的函数

东门玺
2023-03-14

我刚刚开始学习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()中包含函数呢?

共有3个答案

章承基
2023-03-14

除此之外,handleClark是为每个Object/Component创建并可访问的函数,而划分是一个本地范围的函数,它们的功能可以几乎相同。然而,将在每个渲染上创建一个新函数,这可能会对以后的性能产生影响,而为一个定义的组件(对象)创建一次handleClark

羊渝
2023-03-14

来自官方网站上的示例:

首先,如果我们想在一开始就构建一个时钟,这就是我们试图用无状态函数对象创建一个面向对象的、可维护的因素的组件的方式。

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操作特性的函数是完全正确的,可以在外部定义。

谭宜
2023-03-14

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 我跑得很快-