关于改进部分的疑问
来源:3-9 月份选择组件 编码第二部分
慕斯6088333
2019-06-06
老师您好,我做了这个视频的改进部分,
添加listener bind click event 可以用来使得点击任意地方会使用监听器调用一个自定义的方法。关键就是要prevent bubble 使得 button 点击和 选择年份 不去触发这个监听器。
实现功能的有两种方法。 e.stopPropagation() 与e.nativeEvent.stopImmediatePropagation();
我不太懂他们两个有什么区别。这个回答中就讨论了。这两个函数以及这两个函数在既包括jquery 和react。js代码中的一些使用。
这里面说的会和代理有关,以及stopImmediatePropagation()会影响执行顺序。
感觉不是很懂
我不太懂这个的联系。我这里尝试了stopPropagation()不是很好使。。
2回答
-
同学 你好 你代码写的非常细心 注释完美 给你点个赞
我在章节 5-6 完成了这个功能,你可以看看我是怎么做的。
你找的帖子很好的讨论了这个问题,核心思想就是 React 的事件已经采取了代理的形式,总体是绑在 document 上面的一个事件,所以当你只是使用 e.stopPropagation() 的时候,没有什么用,document 上面那个 click 还是会被调用,冒泡没有被阻止。所以 React 又推出了 你说看到的 e.nativeEvent.stopImmediatePropagation(),这个可以帮助其他在 root 上面绑定的 DOM 事件被调用。
Use Event.stopImmediatePropagation to prevent your other (jQuery in this case) listeners on the root from being called. It is supported in IE9+ and modern browsers.
012019-06-06 -
慕斯6088333
提问者
2019-06-06
constructor(props){ super(props) this.state = { isOpenDropDown: false, selectedYear: this.props.year, selectedMonth: this.props.month } this.stopPropagation = this.stopPropagation.bind(this); } /** * Add listener when MonthPicker has constructed * Listen all the click event on this page * */ componentDidMount() { document.addEventListener("click", this.hideAndSubmit) } /** * When the user clicks other area, * close the dropDown list and invoke the callback function */ hideAndSubmit = (event) => { event.preventDefault(); this.setState({ isOpenDropDown: false }) this.props.onChange(this.state.selectedYear, this.state.selectedMonth) } /** * Use Event.stopImmediatePropagation to prevent your listeners on the root from being called. * It is supported in IE9+ and modern browsers. * @param {*} event */ stopPropagation(event) { event.nativeEvent.stopImmediatePropagation(); } toggleDropdown = (event) =>{ this.stopPropagation(event); event.preventDefault(); this.setState({ isOpenDropDown: !this.state.isOpenDropDown }) }
部分代码如上。
00
相似问题