我对学习react 很困惑.

export default function Foo(){
    return(
        <div>
            <div>some text</div>
        </div>
    )
}

我想添加一个子组件:

export default function Foo(){

    const Bar  = ()=>{
        return (
            <input placeholder="some input"/>
        )
    }
    return(
        <div>
            <div>some text</div>
        </div>
    )
}

据我所知,我可以用两种方式使用这个组件:

1. Use as function

return(
        <div>
            <div>some text</div>
            {Bar()}
        </div>
    )

2. use as component:

 return(
        <div>
            <div>some text</div>
            <Bar/>
        </div>
    )

这两者到底有什么不同?我认为这是一样的,直到我遇到输入字段的问题,如果我使用组件作为<Bar/>The focus on input field will be lost after I enter first letter

此处演示:https://codesandbox.io/s/gifted-archimedes-l7bce7?file=/src/App.js

那么这里的确切问题是什么?我一直将代码作为组件,根据我的理解,<Bar/>返回102时与Bar()相同

我说得对不对?

编辑:我发现了这个博客,它非常接近这个问题,也很棒:)

推荐答案

  1. 要成为component,函数返回JSX应该用作<Component />not as Component().

  2. 当功能组件用作<Component />时,它将具有lifecycle,并且可以具有state.

  3. 当一个函数被调用directly as Component()时,它将运行并(可能)返回一些东西.No lifecycle, no hooks,没有react 魔法.

The above 3 statement is the answer to your probem.

当您将组件调用为{Child()}时,它没有任何生命周期或挂钩,而当您调用为时,它有自己的生命周期和挂钩,这就是您面临这些问题的原因.

欲了解更多信息,请阅读本主题:Link.

Javascript相关问答推荐

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

Chrome是否忽略WebAuthentication userVerification设置?""

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

成功完成Reducers后不更新状态

优化Google Sheet脚本以将下拉菜单和公式添加到多行

这个值总是返回未定义的-Reaction

以Angular 实现ng-Circle-Progress时出错:模块没有导出的成员

使用VUE和SCSS的数字滚动动画(&;内容生成)

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

TypeError:无法读取未定义的属性(正在读取';宽度';)

如何确保预订系统跨不同时区的日期时间处理一致?

如何组合Multer上传?

JavaScript -复制到剪贴板在Windows计算机上无效

在Java脚本中构建接口的对象

需要刷新以查看Mern堆栈应用程序中的更改

KeyboardEvent:检测到键具有打印的表示形式

如何使用Angular JS双击按钮

如何在HTML中使用rxjs显示动态更新

获取S点击的元素类(这?)并将其应用于另一个元素(目标),同时删除目标元素上的所有类

将数据对象代码中缺失的属性添加到单个对象不起作用