-
Notifications
You must be signed in to change notification settings - Fork 4.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
taro3.0版本获取不到元素的dataset属性 #7313
Comments
@xwJin 用 React 的语法逻辑进行编码,这种情况你事件函数 bind 一下固定参数就行了,ref 取 Taro DOM 节点获取上面的 props 应该也可以。 |
@Chen-jj 感谢回答,但是目前的遇到场景其实是,要对商品列表的每个商品做可视上报,这里就用到createIntersectionObserver,之前用2.0版本是通过给每个商品的data- 加上商品信息,然后在createIntersectionObserver.observe 监听到后,做上报处理,现在升级到3.0 不提供dataset了,就没有找到好的方法获取监听到显示的商品的信息,求解~ |
|
@Chen-jj 试了下,报错没有getElementById这个方法,而且添加了data-属性的元素上也没有显示这个属性, |
@Chen-jj 用SelectorQuery也是获取不到元素的dataset的,是不是框架在编译的时候把与标签的这个属性忽略了~ |
不是设置 dataset,你就当 H5 操作 |
在小程序中 createIntersectionObserver 获取 dom 上的数据只能通过 dataset 的形式,目前 dom 上都没有 data- 对应的属性 |
@Chen-jj 目前想在createIntersectionObserver 监听到商品显示的时候,获取对应元素的data- 属性,但是目前对应元素data-属性是空,刚刚用document.getElementById这个方法试了,但是报错没有这个方法 |
@Chen-jj 使用bind是能解决事件参数传值的问题,但是支持 dataset 不是让框架接近原生吗,不应该抛弃这个特性吧。 |
这个是因为 taro 在编译的时候只有把基本的属性如 class 写到了标签上,其它的东西很多都被内部接管了。这样在使用一些原生方法获取到页面的节点的时候由于节点上实际没有对应的属性而取不到。dataset 还是希望官方支持一下。 |
Taro 3 是运行时框架,通过模板拼接渲染 DOM,可以看 dist/base.xml。因为小程序 DOM 不能动态添加属性,所有属性都是提前写死的,不能支持用户自定义设置 Taro 1、2可以支持是因为它们是编译时框架,xml 是编译时根据用户的代码生成的。 我的理解是直接用 ref 或 function Index () {
const ref = useRef(null)
useEffect(() => {
console.log('el.props.a: ', ref.current.props.a)
console.log(document.getElementById('xxx').props.a)
})
return (
<View>
<View id='xxx' a={1} ref={ref}></View>
</View>
)
} 如果这样满足不了你们的场景,可以提供一份 demo,我们再看看 |
@Chen-jj 用document.getElementById('xxx')可以了,感谢帮忙解答!! |
建议taro可以给每个元素的dataset设置一个空对象,提供一个读写这个对象的方法 |
期望能支持已选 用户自定义设置 data- 和小程序 dataset 呀 @Chen-jj |
@Chen-jj 比如weui.wxss里面写死了的样式,很多都是 |
希望h5渲染器能支持data-*属性,这个需求太普遍了。 |
@Chen-jj ,如果不支持动态添加属性,不知道是否可以写死若干个data-*的属性,比如固定data-prop1, data-prop2, data-prop3。至少让用户在某些场景下能够使用dataset属性,不过这样会增加base.xml的尺寸,希望权衡一下 |
@Chen-jj 你好,现在有个不得不用到 |
统一回复一下。 一般情况我们还是建议按 React、 Vue 的 DSL 特性进行思考,毕竟 dataset
这点 Taro 是支持的,在事件回调对象中可以通过 taro/packages/taro-runtime/src/dom/event.ts Lines 55 to 68 in b73d526
模板属性上一点所说的,Taro 对于小程序 @focus0802 @Rambos @cuiyajie 各位的诉求都是为组件的模板添加一些特殊属性(和 之前的回答有说过原因:
如果实在是需要为组件模板设置一些特殊属性,如 @cuiyajie 所述,可以考虑使用 taro-plugin-inject 插件注入一些通用属性。 |
@bluescurry 你给元素设置id属性,在observer回调函数的res值可以看到有个id属性,直接用document.getElementById去获取可以解决 |
各位楼主,最后有解决方案吗? |
这个问题直接导致 用于车联平台的 微信小程序直接不可用…… 因为ZBE旋钮实体按键映射是需要通过注入特定dataset属性来识别的。而且不是通用属性……不可能所有节点的data-xxx 都设置为同样的 建议如果不是纯技术原因导致的“做不了” 还是加上吧,哲学没那么重要 |
我也是认为需要加上,建议如果不是纯技术原因导致的“做不了” 还是加上吧,哲学没那么重要,dataset难道不是html自带的东西吗?https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset |
为何不继承HTML的data-*?, 不是说能编译H5? |
确实可以通过 id 获取到 TaroElement 对象,而这个对象,包含了所有我们想要的,包括 dataset,可惜调试的时候肉眼看不见data 属性,所以也无法通过这样方式使用 css的[data-*]属性选择器 ps: 我这里主要实现了两个功能 给富文本添加点击事件,代理所有的点击事件。目前观察,每一个节点本身都会携带一个uid, 可以直接通过 event 如下方式获取到 TaroElement const captureTap = (e: any) => {
const el = document.getElementById(e.mpEvent.target.id) as unknown as TaroElement;
console.log('el', el);
if (!el) return;
if (el.nodeName === 'image') {
openImagePreview(el.props.src);
return;
// @ts-ignore TaroElement missing h5tagName
} else if (el.h5tagName === 'a') {
gotoWebView({ url: el.props.href });
return;
}
}
// 修改图片行内默认样式,增加 dataset 属性
// https://juejin.cn/post/7034744611343958052
Taro.options.html.transformElement = (el) => {
if (el.nodeName === "image") {
el.setAttribute("mode", "widthFix");
el.dataset.previewSrc = el.props.src;
el.dataset.others = "others";
}
return el;
};
return (
<View
onClick={captureTap}
dangerouslySetInnerHTML={{ __html: content }}
/>
); |
非常感谢,确实可以获取到。 import { TaroEvent, document } from '@tarojs/runtime';
const getDatasetFromTaroEvent = (e: TaroEvent) => {
const id = e.mpEvent?.target.id || '';
if (id === '') return {};
const taroElement = document.getElementById(id)
return taroElement?.dataset || {};
} |
使用了类似的解决方案,不过神奇的是 el.dataset.xxx 我的用的el.setAttribute('data-xxx'), 然后e.target里就找不到了,呜呜~,使用el.dateset.xxx = xxx 就可以了 |
可以通过实现一个平台插件来编写车联平台和wmpf小程序,我就这么实现的,但是把坑挺多,只要写的属性默认就是undefined,比如data-focusindex,不填写的view直接变成了undefined,导致ZEB不准 |
相关平台
微信小程序
小程序基础库: 2.12.1
使用框架: Nerv
复现步骤
taro官方模板项目, 在任意view标签上加data-*属性, 在点击事件的event对象里获取的dataset为空
期望结果
能够获取到dataset
实际结果
获取不到dataset
环境信息
The text was updated successfully, but these errors were encountered: