ReactJS:(孙)子组件上的onClick处理函数无法工作

3

我正在尝试使用React、Redux构建一个嵌套的简单页面。底层问题并不是由于Redux/connect引起的,因为如果我尝试操作代码,我可以成功调度操作。

我的问题是,当我点击图片(甚至按钮)时,并没有看到任何事件被触发。

渲染 孙子组件的方法:

<Fragment>
    <div key={blog.id} className='mb-1 mt-1'>
        <img key={blog.id} src={ path_im } alt={'blog'} width="15" height="15" 
         onClick={this.props.onPrefClick} />
  </div>
</Fragment>

我是React和Redux的新手,尝试了很多在网上找到的解决方案,但是在我的情况下似乎没有什么能够解决问题,现在我被卡住了。

我的组件如下:

<Dashboard\>
  <BlogList\>

博客列表(父组件):

  <div>
     { this.props.blogs.map(this.renderBlogItem) }
  </div>

  updatePreference = (blog) => {
      console.log('1 Blog List this.updatePreference: clicked ');
  }

  renderBlogItem = blog => {
      return <BlogItem key={'m0' + blog.id} onBlogClick={() => this.updatePreference(blog)} />;
  }

博客项(直接子组件)

//this has some JSX static code and below child component
<PreferenceItem key={blog.id} onPrefClick={() => this.props.onBlogClick} />

偏好项(子组件的子组件)
//this has some JSX static code and below image with onClick
<div key={blog.id} className='mb-1 mt-1'>
    <img key={blog.id} src={ path_im } alt={'blog'} width="15" height="15" onClick={this.props.onPrefClick}/>


我原本希望这是一个简单的事件流程,但是有些地方出了问题。我将其简化并更改了所有三个组件中的点击函数,改为箭头函数(=>)和其他选项,但无论何时我点击图片,onClick都没有被触发(当我在代码中进行操作时,在孙子组件中使用绑定(与在同一类中定义的函数),它触发了事件,但在页面加载期间不应该这样)。
所以这里有些不对劲。
这里有一个示例工作的代码,其中有一个嵌套的子级。
我主要遵循官方文档reactjsreact-redux和一些来自freecodecamp.org的参考资料。

还有一个问题

我现在无法粘贴图像 - Chrome 调试工具显示图像元素的 EventListener 的处理程序指向 noop 函数,而 FunctionLocation 是未知的 (为什么是 noop?这反映了我的绑定不正确,但我无法修复它)

如果我查看孙子的属性,它指向 onPrefClick

请也指导我如何调试以找到根本原因?

元素是 enter image description here 组件现在引用 onBlogClick enter image description here

2个回答

1

我在这里看到一个问题 - 应该同时调用函数 () => this.props.onBlogClick():

<PreferenceItem key={blog.id} onPrefClick={() => this.props.onBlogClick} />

我猜这行应该是以下内容:

<PreferenceItem key={blog.id} onPrefClick={this.props.onBlogClick} />

你没有调用该函数,只是返回它。
另一个问题 - 也许这只是你问题中的一个笔误,但在 onClick 中缺少一个 {
<img key={blog.id} src={ path_im } alt={'blog'} width="15" height="15" onClick=this.props.onPrefClick}/>

我希望这有所帮助!

1
@norbitial 是的,那是个笔误,感谢你指出来。我已经从 PreferenceItem 中删除了箭头函数,但 onClick 没有改变。我现在也添加了图片。 - mamtach

1

您在这行代码中有语法错误。

<img key={blog.id} src={ path_im } alt={'blog'} width="15" height="15" onClick=this.props.onPrefClick}/>

上面应该是onClick={() => this.props.onPrefClick()}(这里也进行了修改)。 事实 当您需要在子组件中调用在父类上声明的函数时,只需要将函数传递给子组件即可。
<ChildComponent function={this.onClickFunction} />

然后您需要在子组件中调用该函数。
<img onClick={() => this.props.function()}

在子组件中,您需要调用该函数。
<Fragment>
    <div key={blog.id} className='mb-1 mt-1'>
        <img key={blog.id} src={ path_im } alt={'blog'} width="15" height="15" 
         onClick={() => this.props.onPrefClick()} />
  </div>
</Fragment>

如果有不正确的地方请纠正我:根据您的建议,现在父组件中这样写: <BlogItem key={blog.id} onBlogClick={this.updatePreference(blog)} />, 子组件是这样: <PreferenceItem key={blog.id} onPrefClick={this.props.onBlogClick} />,孙子组件是这样的: <img key={blog.id} src={ path_im } alt={'blog'} width="15" height="15" onClick={() => this.props.onPrefClick()} /> 经过这些更改之后,父组件中声明的函数会在页面加载时被调用。当我点击图像时,需要这个函数。看起来我的onClick没有任何影响。请参考您最近添加的图片。 - mamtach
试试这个沙盒,它展示了img如何与onClick关联 https://codesandbox.io/s/gallant-yalow-ru406?fontsize=14&hidenavigation=1&theme=dark - Govinda Malavipathirana
谢谢,这个沙盒代码可以运行,我稍微修改了一下,在沙盒中添加了更多的组件,也按预期工作了。但是同样的东西在我的代码中却不起作用。 - mamtach
谢谢,玩弄你的代码并仔细查看我的代码后,它就像魔术般奏效了。 - mamtach
很高兴能帮助你 :D - Govinda Malavipathirana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接