Open moseszhou opened 1 year ago
我也遇到了相同的问题,Taro 3.5.12版本 在微信小程序端 当canvas组件嵌套过深(20层)时,canvas无法正常绘制
遇到相同问题,不知道有什么解决方案
@moseszhou @ChengGPBU @linhaobin 可以参考这篇文档试试: https://docs.taro.zone/docs/ref/#%E4%BD%BF%E7%94%A8%E4%BA%86-customwrapper-%E6%97%B6
@moseszhou @ChengGPBU @linhaobin 可以参考这篇文档试试。
?? 哪篇文档
找到一种解决方法
export interface Node {
tagName: string;
parentNode?: Node;
ctx: any;
}
export function findCustomWrapperParent(nodeRef: React.RefObject<unknown>) {
let node = (nodeRef.current as Node)?.parentNode;
while (node) {
if (node.tagName === 'CUSTOM-WRAPPER') {
return node;
}
node = node.parentNode;
}
return null;
}
export async function getClientRect({
ref,
selectorStr,
}: {
ref?: React.RefObject<unknown>;
selectorStr: string;
}) {
let selector = Taro.createSelectorQuery();
if (ref) {
const customWrapper = findCustomWrapperParent(ref);
if (customWrapper) {
selector = selector.in(customWrapper.ctx);
}
}
return new Promise<Taro.NodesRef.BoundingClientRectCallbackResult[]>((resolve) => {
selector
.select(selectorStr)
.boundingClientRect()
.exec((res) => {
resolve(res);
});
});
}
function MyComponent() {
const ref = useRef(null);
useReady(async () => {
const result = await getClientRect({ ref, selectorStr: '#linhaobin' });
console.info(result);
});
return (
<View ref={ref} id="linhaobin">
hello bin
</View>
);
}
找到一种解决方法
export interface Node { tagName: string; parentNode?: Node; ctx: any; } export function findCustomWrapperParent(nodeRef: React.RefObject<unknown>) { let node = (nodeRef.current as Node)?.parentNode; while (node) { if (node.tagName === 'CUSTOM-WRAPPER') { return node; } node = node.parentNode; } return null; } export async function getClientRect({ ref, selectorStr, }: { ref?: React.RefObject<unknown>; selectorStr: string; }) { let selector = Taro.createSelectorQuery(); if (ref) { const customWrapper = findCustomWrapperParent(ref); if (customWrapper) { selector = selector.in(customWrapper.ctx); } } return new Promise<Taro.NodesRef.BoundingClientRectCallbackResult[]>((resolve) => { selector .select(selectorStr) .boundingClientRect() .exec((res) => { resolve(res); }); }); }
function MyComponent() { const ref = useRef(null); useReady(async () => { const result = await getClientRect({ ref, selectorStr: '#hbin' }); console.info(result); }); return ( <View ref={ref} id="linhaobin"> hello bin </View> ); }
我们现在也是按照这个方案做的
找到一种解决方法
export interface Node { tagName: string; parentNode?: Node; ctx: any; } export function findCustomWrapperParent(nodeRef: React.RefObject<unknown>) { let node = (nodeRef.current as Node)?.parentNode; while (node) { if (node.tagName === 'CUSTOM-WRAPPER') { return node; } node = node.parentNode; } return null; } export async function getClientRect({ ref, selectorStr, }: { ref?: React.RefObject<unknown>; selectorStr: string; }) { let selector = Taro.createSelectorQuery(); if (ref) { const customWrapper = findCustomWrapperParent(ref); if (customWrapper) { selector = selector.in(customWrapper.ctx); } } return new Promise<Taro.NodesRef.BoundingClientRectCallbackResult[]>((resolve) => { selector .select(selectorStr) .boundingClientRect() .exec((res) => { resolve(res); }); }); }
function MyComponent() { const ref = useRef(null); useReady(async () => { const result = await getClientRect({ ref, selectorStr: '#hbin' }); console.info(result); }); return ( <View ref={ref} id="linhaobin"> hello bin </View> ); }
findCustomWrapperParent要找到所有的CustomWrapper父节点才行,不然的话不支持多层嵌套
不然的话不支持多层嵌套
实测嵌套也可以,只要找到第一个CustomWrapper 父节点
@moseszhou @ChengGPBU @linhaobin 可以参考这篇文档试试: https://docs.taro.zone/docs/ref/#%E4%BD%BF%E7%94%A8%E4%BA%86-customwrapper-%E6%97%B6
你没有看清楚我的诉求,问题是找到合适scope,开发组件时需要不知道自己是否会被customwrapper包裹。
例如我开发一个qrcode组件,会用到 const ctx = Taro.createCanvasContext(id, $scope),在taro3.x中 $scope 一般为 getCurrentInstance().page,但是qrcode组件不知道这个组件是否被引用时是否包裹了CustomWrapper,以及他的的父组件是否也被CustomWrapper包裹。是否有办法让我在做qrcode组件时,有一个固定的方式拿到$scope,不管他的上层被包裹过一次或者多次CustomWrapper
@moseszhou @ChengGPBU @linhaobin 可以参考这篇文档试试: https://docs.taro.zone/docs/ref/#%E4%BD%BF%E7%94%A8%E4%BA%86-customwrapper-%E6%97%B6
你没有看清楚我的诉求,问题是找到合适scope,开发组件时需要不知道自己是否会被customwrapper包裹。
例如我开发一个qrcode组件,会用到 const ctx = Taro.createCanvasContext(id, $scope),在taro3.x中 $scope 一般为 getCurrentInstance().page,但是qrcode组件不知道这个组件是否被引用时是否包裹了CustomWrapper,以及他的的父组件是否也被CustomWrapper包裹。是否有办法让我在做qrcode组件时,有一个固定的方式拿到$scope,不管他的上层被包裹过一次或者多次CustomWrapper
qrcode 组件里主动使用 CustomWrapper 组件进行包裹是否可行?
@moseszhou @ChengGPBU @linhaobin 可以参考这篇文档试试: https://docs.taro.zone/docs/ref/#%E4%BD%BF%E7%94%A8%E4%BA%86-customwrapper-%E6%97%B6
你没有看清楚我的诉求,问题是找到合适scope,开发组件时需要不知道自己是否会被customwrapper包裹。 例如我开发一个qrcode组件,会用到 const ctx = Taro.createCanvasContext(id, $scope),在taro3.x中 $scope 一般为 getCurrentInstance().page,但是qrcode组件不知道这个组件是否被引用时是否包裹了CustomWrapper,以及他的的父组件是否也被CustomWrapper包裹。是否有办法让我在做qrcode组件时,有一个固定的方式拿到$scope,不管他的上层被包裹过一次或者多次CustomWrapper
qrcode 组件里主动使用 CustomWrapper 组件进行包裹是否可行? 实测要求 selectComponent('#customWrapper_1 >>> #customWrapper_2 >>> ..... >>> #customWrapper_n') 才能找到找到最终的scope, 如果缺失部分#customWrapper_2 是无法找到最终的scope的 也就是说需要完整的#customWrapper_id的路径
相关平台
微信小程序
小程序基础库: 2.32.1 使用框架: React
复现步骤
CustomWrapper 包裹
期望结果
例如我开发一个qrcode组件,会用到 const ctx = Taro.createCanvasContext(id, $scope),在taro3.x中 $scope 一般为 getCurrentInstance().page,但是qrcode组件不知道这个组件是否被引用时是否包裹了CustomWrapper,以及他的的父组件是否也被CustomWrapper包裹。是否有办法让我在做qrcode组件时,有一个固定的方式拿到$scope,不管他的上层被包裹过一次或者多次CustomWrapper
实际结果
不知道被包裹多少层CustomWrapper,从而无法找到canvas对象
环境信息