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

React如何实现类似Pressable的模式,将内部状态作为参数传给子渲染函数

你要实现的是React中常见的**渲染属性(Render Props)**模式,不需要借助Context,只要将作为children传入的函数执行、同时把内部状态作为参数传入即可。

核心调整点

你原来的代码直接渲染了children,但此时你传入的children是一个接收参数返回元素的函数,所以需要主动调用它并传入你想暴露的状态:

const Component = ({ children }) => {
  const [active, setActive] = React.useState(true);
  // 增加类型判断,兼容直接传入普通React元素的场景
  return <View>{typeof children === 'function' ? children({ active }) : children}</View>;
};

调整后你的示例代码即可正常运行,正确根据active的值渲染对应文本。

扩展:实现类似Pressable的按压状态

如果要复现Pressable的pressed状态逻辑,只需要给容器绑定对应的触摸事件修改状态即可:

import * as React from 'react';
import { Text, View } from 'react-native';

const PressableLike = ({ children, onPress }) => {
  const [pressed, setPressed] = React.useState(false);

  return (
    <View
      onTouchStart={() => setPressed(true)}
      onTouchEnd={() => {
        setPressed(false);
        onPress?.();
      }}
      onTouchCancel={() => setPressed(false)}
    >
      {typeof children === 'function' ? children({ pressed }) : children}
    </View>
  );
};

// 调用方式和原生Pressable完全一致
export default function App() {
  return (
    <View>
      <PressableLike onPress={() => console.log('点击触发')}>
        {({pressed}) => (
          <Text>{pressed ? "Pressed!" : "Press Me"}</Text>
        )}
      </PressableLike>
    </View>
  );
}

内容的提问来源于stack exchange,提问作者wongx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:36:04