账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    react 父组件中绑定事件失效。
    64
    0

    我想循环的给一个组建添加事件,但是为什么不行?

    
    class Lesson extends Component {
      /* TODO */
      constructor(){
        super()
      }
    
      alertInfo(lesson,index){
        console.log(index+"-"+lesson.title)
      }
    
    
      
      render(){
        const lesson=this.props.lesson
        const index=this.props.index
        console.log(lesson)
        
        return(
          <div >
            <h1 onClick={this.alertInfo.bind(this,lesson,index)}>{ lesson.title }</h1>
            <p>{ lesson.description }</p>
          </div>      
          )
    
      }
    }
    
    
    
    
    
    
    
    
    class LessonsList extends Component {
      /* TODO */
      constructor(){
        super()
      }
      
      info(){
        console.log(666)
      }
      
    
      render(){
        const lessons = this.props.lessons
        console.log(lessons)
        return (
          <div>
            {
              lessons.map((item,index)=>
                  <Lesson lesson={item} key={index} index={index} onClick={()=>{console.log(666)}}/>
              )
            }
          </div>
          )
      }
    
    }
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 放开那女孩儿 普通会员 1楼

      在React中,父组件通过子组件的useEffect钩子和addEventListener方法绑定事件时,如果子组件的状态改变或生命周期事件触发,父组件的绑定事件可能会失效。这是因为React的生命周期方法会在子组件的状态发生变化时自动调用父组件的回调函数,这些回调函数在不添加useEffect的情况下会忽略子组件的状态改变。

      以下是一个例子,展示在React父组件中绑定事件失效的情况:

      ```jsx import React, { useState } from 'react';

      function ParentComponent() { const [data, setData] = useState([]);

      function handleDataChange(data) { setData(data); // 当父组件重新渲染时,数据状态可能会更新,导致父组件的事件绑定失效 // 如果父组件希望保持数据状态不变,需要在useEffect中处理这种情况 // 例如,可以在useEffect中添加一个unsubscribe操作符,当数据状态发生变化时,通知父组件不再需要回调函数 setTimeout(() => { setData([]); }, 1000); }

      return (

        {data.map((item, index) => (
      • {item}
      • ))}
      ); }

      export default ParentComponent; ```

      在这个例子中,ParentComponent组件在子组件的状态改变时触发了handleDataChange函数。然而,当子组件重新渲染时(在setTimeout函数中),handleDataChange函数可能已经被useEffect回调函数覆盖,导致数据状态不再与父组件绑定。

      为了避免这种情况,可以在useEffect中添加一个unsubscribe操作符,如下所示:

      ```jsx import React, { useState } from 'react';

      function ParentComponent() { const [data, setData] = useState([]);

      function handleDataChange(data) { setData(data); // 当父组件重新渲染时,数据状态可能会更新,导致父组件的事件绑定失效 // 如果父组件希望保持数据状态不变,需要在useEffect中处理这种情况 // 例如,可以在useEffect中添加一个unsubscribe操作符,当数据状态发生变化时,通知父组件不再需要回调函数 setTimeout(() => { setData([]); }, 1000); }

      useEffect(() => { // 在数据发生变化时,调用子组件的回调函数 const unsubscribe = setData => { // 在这里添加一个全局变量,当数据发生变化时,更新全局变量 // 然后在useEffect中通知子组件不再需要回调函数 // 这样,当子组件重新渲染时,数据状态仍然会与父组件绑定 const unsubscribeGlobal = globalVariable; // 这里假设全局变量名为globalVariable,可以改变其名称以适应实际情况 unsubscribeGlobal(data); };

      // 保存子组件的回调函数作为全局变量,当数据发生变化时,更新全局变量
      // 然后在`useEffect`中通知子组件不再需要回调函数
      // 这样,当子组件重新渲染时,数据状态仍然会与父组件绑定
      return () => {
        unsubscribe(globalVariable);
      };
      

      }, [data]);

      return (

        {data.map((item, index) => (
      • {item}
      • ))}
      ); }

      export default ParentComponent; ```

      在这个例子中,ParentComponent组件在子组件的状态变化时触发了handleDataChange函数,但子组件的状态变化不会触发useEffect回调函数,因此数据状态与父组件绑定。在useEffect中添加了全局变量unsubscribeGlobal,当子组件的状态发生变化时,更新unsubscribeGlobal,然后通知子组件不再需要回调函数,这样子组件在重新渲染时,数据状态仍然与父组件绑定。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部