React/RN的不足之处

2,044 阅读2分钟

自己在开发过程中遇到的一些问题,并觉得这是react或者reactNative本身的不足之处,浅浅记录一下。看看大家是否也遇到过或者遇到其他问题,并如何解决的!!持续更新中。。。 React问题

1、样式问题-图文混拍

reactNative中经常会有文本Text中带有View的场景。手机端页面设计风格常有比如一段文字后紧紧跟随一个icon,并随文本的换行而换行的样式,用于比如点击弹alert展示针对该文本的描述。这种通常我们使用Text组件中嵌入View组件这种hack方式(非官方推荐用法)。但是,rn的Text组件不同于View组件,在Text内部,很多View的属性比如margin、padding等往往是无效的,所有很难调整View组件的位置,容易出现View组件与文本不对齐甚至被截断的场景!

方法:不对齐的话我有时会通过给这个View上、下填补空白View的方式进行调整,或者View再嵌套View等方法去尝试,总之都是一些并非RN真正推荐的或者合理的方法去解决!

2、ReactElement渲染结果没有属性可以直接判断

react通过JSX标签的方式会生成一个ReactElement对象,哪怕是返回null,比如:

// JSX
const Bottom = () => {return null}

const Main = () => {
    return (
        <Box
            title="title"
            bottom={<Bottom/>}
        />
    )
}

虽然Bottom返回的是null,但是Bottom类型并不是null,而是一个渲染结果为null的ReactElement对象。所以如果Box需要对传入的属性bottom进行判断的话(比如bottom是否存在影响其他地方某个布局),这是我们不能判断bottom是否为空/null。而React貌似也并没有一个直接的方法或者属性可以直接判断ReactElement对象渲染出来是否为空/null!

备注:isValidElement是检测某个值是否是一个React元素,React元素指的是通过JSX标签/createElement产生的值!

附加:JSX标签不同于HTML标签。一方面它必须封闭;二是只能返回一个根元素,这是因为JSX底层其实是被转化为了JavaScript对象,Babel会把JSX转译为React.createElement()函数调用,自然我们并不能在一个函数中返回多个对象;

方法:

1、采用函数的形式

// function
const renderBottom = () => {return null}

const Main = () => {
    return (
        <Box
            title="title"
            bottom={renderBottom()}
        />
    )
}

2、动态判断。Bottom渲染之后,获取元素渲染的情况比如高度、宽度等等。

3、状态管理

react本身并没有太好的状态管理方案!通常使用Redux、mobX第三方状态管理库。react本身是使用上下文createContext/useContext以及逐层传递props的方式进行状态管理。