You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

react-native-scratch刮刮卡完成刮取后如何重置以支持再次刮取

react-native-scratch 刮刮卡二次刮取重置方案

核心实现方式

方案1:调用组件内置reset方法(优先使用)

react-native-scratch 组件本身暴露了reset实例方法,通过ref绑定组件后直接调用即可完成重置,无需重新挂载组件,性能最优。

实现步骤:

  • 声明ref绑定到Scratch组件
  • 需要重置时调用ref.current.reset()
  • 刮取完成回调中调用可加100~300ms延时,让用户先看到刮取结果再重置,优化使用体验

方案2:key属性强制重渲染(兼容旧版本)

如果使用的版本未提供reset方法,可通过给组件绑定动态key的方式,触发React销毁旧组件并重新挂载,实现原生重置效果。

实现步骤:

  • 声明一个数字类型的state作为key值
  • 需要重置时将key值+1,组件自动重新初始化

完整代码示例

import React, { useState, useRef } from 'react';
import { View, Button } from 'react-native';
import Scratch from 'react-native-scratch';

const ScratchCardDemo = () => {
  const scratchRef = useRef(null);
  const [resetKey, setResetKey] = useState(0);

  // 刮取完成逻辑
  const onScratchFinish = () => {
    // 此处为你获取刮取结果的业务逻辑
    console.log('刮取结果已获取');
    
    setTimeout(() => {
      // 优先使用内置reset方法
      if (scratchRef.current) {
        scratchRef.current.reset();
        return;
      }
      // reset方法不可用时切换为key重渲染方案
      setResetKey(prev => prev + 1);
    }, 200);
  };

  return (
    <View>
      <Scratch
        key={resetKey}
        ref={scratchRef}
        // 刮取进度阈值可自定义,示例为刮开70%判定完成
        onScratchProgress={(progress) => progress > 70 && onScratchFinish()}
        // 其余原组件配置保持不变
        brushSize={20}
      />
      <Button 
        title="手动重置刮刮卡" 
        onPress={() => scratchRef.current?.reset() || setResetKey(prev => prev + 1)} 
      />
    </View>
  );
};

export default ScratchCardDemo;

注意事项

  • 调用实例方法前需判断ref.current是否存在,避免空指针报错
  • 使用key方案时不要用随机数作为key值,使用自增数字即可,避免不必要的重复渲染
  • 若自定义了刮取完成后的锁定逻辑,重置时需同步更新对应状态标记,避免自定义逻辑阻止二次刮取

内容的提问来源于stack exchange,提问作者Rashid Ali Butt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 07:24:02