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

React Native中useState变量passShow提示只读的问题求助

解决React Native中密码显示/隐藏状态的只读错误及文本切换问题

修正后的完整代码

import { View, Text, Image, TextInput, TouchableOpacity, Pressable } from 'react-native'
import React, { useState } from 'react'
import logo from '../assets/client.png'
import { SafeAreaView } from 'react-native-safe-area-context'
import { Link } from 'expo-router'

// 组件名改为大写(React要求组件首字母大写)
const App = () => {
    const [passShow, setShow] = useState(true);
  return (
    <SafeAreaView className='flex-1'>
        <View className="flex-1 items-center justify-between bg-white">
            <View className='mt-36'>
                <Image source={logo} style={{width: 150, height: 96}}/>
                <Text className="text-xl py-5 mt-2 font-bold text-left w-11/12">Sign In to your Account</Text>
            </View>

            <View className='w-full items-center'>
                <View className="w-11/12 my-2">
                    <Text>Customer ID</Text>
                    <TextInput cursorColor={'#cc0000'} className="w-full border-gray-100 border-2 border-solid p-1 mt-2 rounded-lg" />
                </View>
                <View className="w-11/12 my-2">
                    <Text>Password</Text>
                    {/* secureTextEntry逻辑正确:passShow=true时隐藏密码,false时显示 */}
                    <TextInput cursorColor={'#cc0000'} secureTextEntry={passShow} className="w-full border-gray-100 border-2 border-solid p-1 mt-2 rounded-lg" />
                    <View className='flex-row justify-between '>
                        <Pressable onPress={() => setShow(!passShow)}>
                            {/* 移除多余的箭头函数,直接使用三元表达式 */}
                            <Text>{passShow ? 'Show Password' : 'Hide Password'}</Text>
                        </Pressable>
                        <Pressable><Text className="text-themeRed my-2">Reset Password</Text></Pressable>
                    </View>
                </View>

                <TouchableOpacity className='bg-themeRed w-11/12 py-3 px-2 items-center rounded-lg mt-3'>
                    <Text className='text-white'>Sign In</Text>
                </TouchableOpacity>
                
                <Link href='/signup' className='flex-row w-11/12 py-3'>
                    <Text>Don't have an Account? </Text>
                    <Text className='text-themeRed ml-1.5'>Sign Up</Text>
                </Link>
            </View>

            <View className='mb-5 items-center'>
                <Text className='text-gray-400'>24/7 support 076 979 0642 | helpdesk@ctecg.co.za</Text>
            </View>
        </View>
    </SafeAreaView>
  )
}

export default App

错误原因及解决说明

  • 文本切换的错误:你之前用{() => passShow ? <Text>Show Password</Text> : <Text>Hide Password</Text>}是错误的,JSX中直接嵌入表达式即可,不需要包裹成箭头函数。这样写会导致渲染的是一个函数而非文本内容,同时可能引发状态读取异常,改成直接写三元表达式{passShow ? 'Show Password' : 'Hide Password'}即可。
  • 组件命名规范:React要求组件名称必须首字母大写,你之前的组件名是app,改成App可以避免潜在的组件识别问题。
  • 状态修改的正确性:确保始终通过setShow修改passShow状态,不要直接赋值(比如passShow = !passShow),这会触发只读错误,因为React的状态变量是不可直接修改的,必须使用对应的状态更新函数。

内容的提问来源于stack exchange,提问作者Dev.Dannel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:56:26