Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >React custom checkbox =>触发器'change‘事件

React custom checkbox =>触发器'change‘事件
EN

Stack Overflow用户
提问于 2021-07-14 20:11:52
回答 1查看 100关注 0票数 0

我用一个普通的div/span制作了a custom checkbox control

因为<input type='checkbox'.../>不能有子元素,所以我用role='checkbox'aria-checked={isChecked}div创建了另一个元素。

然后,我处理了鼠标和键盘事件来切换检查状态。

问题是:

如何触发'change'事件?下面的代码在react 16中不起作用

代码语言:javascript
运行
AI代码解释
复制
refTarget?.current?.dispatchEvent(new Event('change', { bubbles: true, cancelable: false }))

另一个技巧是直接调用props.onChange

它可以工作,但事件不会冒泡到父<form onChange={(e) => console.log('changed!')}></form>

EN

回答 1

Stack Overflow用户

发布于 2021-07-14 22:01:29

你有两种方法可以做到这一点。

1.动态创建所有事件。

eventTarget.dispatchEvent不能在React中工作。有关替代方法和有关这方面的更多信息,请查看this question

2.从输入接收onChange事件

您可以接收保持真实的input元素被不透明隐藏,并使其跨越您的元素的全宽/全高。那么你只需要在这个input上监听onChange就行了。

material-ui就是这样做的

示例

代码语言:javascript
运行
AI代码解释
复制
const { useCallback, useState, useRef } = React;

const MyCheckBox = React.forwardRef((props, ref) => {
  const { onChange, onBlur, onFocus, ...otherProps } = props;
  
  const [checked, setChecked] = useState(false);
  
  const handleFocus = useCallback((e) => {
    // do something,
    // like add some className for effects
    if (typeof onFocus === 'function')
      onFocus(e)
  }, [])
  const handleBlur = useCallback((e) => {
    // do something,
    // like remove some className for effects
    if (typeof onBlur === 'function')
      onBlur(e)
  }, [])
  
  const handleChange = useCallback((e) => {
    setChecked(e.target.checked);
    if (typeof onChange=== 'function')
      onChange(e)
  }, []);
  
  return <div onFocus={handleFocus} onBlur={handleBlur} className="checkbox-root">
  {checked ? 'Checked' : 'Not checked'}
    <input onChange={handleChange} ref={ref} type="checkbox" className="checkbox-input" {...otherProps} />
  </div>
})

const App = (props) => {
 return <div>
 <MyCheckBox onChange={e => console.log('change', e.target.checked)} onFocus={e => console.log('focus')} onBlur={e => console.log('blur')} />
 </div>;
}

ReactDOM.render(<App />, document.querySelector('#root'))
代码语言:javascript
运行
AI代码解释
复制
.checkbox-root {
  position: relative;
  height: 40px;
  width: 40px;
  border: 1px solid red;
}
.checkbox-input {
  position: absolute;
  opacity: 0.1;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
  margin: 0;
}

.hidden-input {
  display: none;
}
代码语言:javascript
运行
AI代码解释
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@material-ui/core@latest/umd/material-ui.production.min.js"></script>

<div id="root"/>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68384512

复制
相关文章
在SharePoint环境下,dll资源脚本权限问题
          最近在用Ext.NET,因为是在SharePoint环境下使用,一直被这样一个问题所困扰着:在使用Ext.NET时,页面必须使用拥有管理权限的用户刷新一次(只要刷新其中任意Ext.NET页面),其他用户才能显示界面。查看网页源代码,发现Extjs的脚本文件和CSS文件并没有注册。而Extjs的脚本文件和css文件是作为资源嵌套在Ext.NET的dll中的。由此想到,应该是用户权限问题,导致Ext.NET的ResourceManager1控件无法注册脚本。
雪雁-心莱科技
2018/12/27
5300
cssjshtml jquery向动态生成的元素添加事件
delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。
葫芦
2019/04/17
3.2K0
如何向图形添加曲形文本
R语言数据分析指南
2023/08/18
3360
如何向图形添加曲形文本
如何向数组里添加元素
一般数组是不能添加元素的,因为数组在初始化时就已定好长度了,不能改变长度,我们如何做到向其中添加元素。
算法与编程之美
2023/01/03
3.7K0
dll生成和使用
dll文件的编译生成 创建项目Win32控制台应用程序 创建项目1.png 创建项目2.png 配置属性 项目/属性 配置属性.png
用户2929716
2018/08/23
1.2K0
dll生成和使用
java如何向数组里添加元素
1、一般数组是不能添加元素的,因为他们在初始化时就已定好长度了,不能改变长度。 但有个可以改变大小的数组为ArrayList,即可以定义一个ArrayList数组,然后用add(element)方法往里添加元素即可,还可add(index,element)往指定下标处添加元素;例子如下:
全栈程序员站长
2022/06/27
20.7K0
java如何向数组中添加元素[数组的添加]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说java如何向数组中添加元素[数组的添加],希望能够帮助大家进步!!!
Java架构师必看
2022/04/06
7.9K0
C#如何加载嵌入到资源的非托管dll
我们总会遇到需要加载非Win32的非托管dll,这里推荐一种方式就是将那些非win32的非托管dll嵌入资源的方式,在入口解压并且加载的方式,我先来看看如何实现吧,首先我们准备好demo,新增控制台项目如下:
ryzenWzd
2021/05/17
1.1K0
C#如何加载嵌入到资源的非托管dll
如何向已有的项目中添加C/C++代码?
  我们需要在src/main下面建立一个cpp目录,然后在其中写一个CMakeLists.txt文件和一个cpp文件,直接给出代码:
故乡的樱花开了
2023/10/22
3700
Python 中如何向列表或数组添加元素
然而,与其它编程语言不同,数组在 Python 中不是一个内置的数据结构。Python 使用列表取代传统的数组。
Python学习者
2023/09/11
5780
向邮件添加附件
可以将附件添加到电子邮件或消息部分(具体地说,是添加到%Net.MailMessagePart或%Net.MailMessage的实例)。要执行此操作,请使用以下方法:
用户7741497
2022/06/09
2.2K0
嵌入式音视频开发过程中如何控制码率?
在音视频领域,码率控制模式有着举足轻重的地位。那什么是码率控制?码率控制是指通过调节图像的压缩比例,从而决定输出编码码率的过程。
用户6280468
2023/08/31
3390
嵌入式音视频开发过程中如何控制码率?
在Windows中劫持DLL
DLL劫持是一种用于执行恶意有效负载的流行技术,这篇文章列出了将近300个可执行文件,它们容易受到Windows 10(1909)上相对路径DLL劫持的攻击,并展示了如何使用几行VBScript绕过UAC可以以提升的特权执行某些DLL劫持。
Al1ex
2021/07/21
2.2K0
在Windows中劫持DLL
一款针对DLL劫持的恶意DLL生成器
EvilDLL是一款专门针对DLL劫持攻击而开发并设计的恶意DLL(反向Shell)生成器。
FB客服
2020/08/07
2.1K0
一款针对DLL劫持的恶意DLL生成器
如何使用 Bootstrap class 向按钮添加下拉菜单
如何使用 Bootstrap class 向按钮添加下拉菜单。如需向按钮添加下拉菜单,只需要简单地在一个 .btn-group 容器中放置按钮和下拉菜单即可。您也可以使用 <span class="caret"></span> 来指示按钮作为下拉菜单。
好派笔记
2021/09/18
5.7K0
Java如何调用dll
-----------------------------前置条件-------------------------------------
烂猪皮
2018/08/03
2.5K0
Java如何调用dll
X86逆向13:向程序中插入Dll
本章我们将学习Dll的注入技巧,我们将把一个动态链接库永久的插入到目标程序中,让程序在运行后直接执行这个Dll文件,这一章的内容也可以看作是第八课的加强篇,第八课中我们向程序中插入了一个弹窗,有木有发现一个问题?单单是一个弹窗我们就需要经历这么多的步骤,那如果你要调用几十个API函数估计早就疯透了,这里我们其实可以直接编写一些能够完成特殊功能的Dll文件,然后让程序通过LoadLibraryA函数动态的加载执行,LoadLibrary这个函数是在Kernel32.dll这个库中保存的,庆幸的是这个动态链接库99%的程序都必须加载,这就为我们动态加载Dll提供了有效的支持。
王瑞MVP
2022/12/28
4170
X86逆向13:向程序中插入Dll
java卸载dll,如何在java中卸载Dll?[通俗易懂]
I have written a Java agent in Lotus Notes 8.5 to reset token’s PIN using
全栈程序员站长
2022/08/30
2K0
OpenCV300 CMake生成project在项目过程中的问题
2015年6一个月4日本。OpenCV官网上面给出了最新版本号OpenCV。这是:3.0.0版本号,http://opencv.org/
全栈程序员站长
2022/07/06
5430
OpenCV300 CMake生成project在项目过程中的问题
点击加载更多

相似问题

嵌入式dll资源

30

查找嵌入式DLL资源

24

如何将源文件(.cs)添加为生成的DLL的嵌入式资源

119

向Kubernetes添加嵌入式设备作为资源

10

是否可以在.NET DLL中添加/删除/更改嵌入式资源?

381
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档