1、react-native-render-html和react-native-htmlview的比较
App项目中需要用到解析HTML的组件,在github上面找到比较合适的两款,react-native-render-html(RNRH)和react-native-htmlview(RNH)。子啊实际的使用过程中,两个各自有不同的问题。
首先RNRH容易红屏,这个使用过的人肯定有体会,而RNH则在图片方面比较不好处理,最终我选择了RNRH。
2、使用
安装什么的就不说了
1 | import HTML from "react-native-render-html"; |
然后在组件的render中
1 2 3 4 5 6 7 | <HTML ignoredStyles={["font-family", "transform", "display", "border-style", "max-width", "default-src", "loadingIndicatorSrc"]} renderers={renderer} debug={true} tagsStyles={{p: {fontSize: 16}, span: {fontSize: 16}}} html={this.state.htmlContent} imagesMaxWidth={width}/> |
注意组件的ignoredStyles属性,这里配置的是需要忽略的css属性,很多导致崩溃的原因就是有些css属性无法解析。所以使用过程中,查看日志很重要,哪个属性导致的崩溃,可以添加在这里。
renderers的写法如下,主要处理图片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | const width = Dimensions.get('window').width; const renderer = { img: (htmlAttribs, children, convertedCSSStyles, passProps) => { const wid = htmlAttribs.width ? htmlAttribs.width : width; const hei = htmlAttribs.height ? htmlAttribs.height * (width - 20) / wid : 200; console.log(htmlAttribs.src); imageArr.push({index: i, uri: htmlAttribs.src});//将图片放入overlay中点击查看 this.setState({ images: imageArr }); i++; return ( <TouchableNativeFeedback key={i} onPress={() => { let index = 0; this.state.images.map((item) => { if (item.uri === htmlAttribs.src) { index = item.index; } }); this.setState({ overLayVisible: true, overLayImageIndex: index }); }}> <Image key={htmlAttribs.src} style={{height: hei, width: width - 20}} resizeMode='contain' source={{uri: htmlAttribs.src}}/> </TouchableNativeFeedback> ) }, ul: (htmlAttribs, children, passProps) => { return <Text style={{ fontWeight: 'normal', marginLeft: 10, paddingLeft: 0, color: '#333', fontSize: 14, fontFamily: 'roboto_slab' }} {...passProps}>{children}</Text> }, }; |
采用这种方式可以保持图片原来的长宽比,不是导致图片失真或者变形。
另外我的后台文本编辑器为百度的Ueditor,两者配合基本满分。