美文网首页
React Native通用组件封装(BoxShadow)

React Native通用组件封装(BoxShadow)

作者: G_console | 来源:发表于2022-12-14 11:48 被阅读0次

    分享一个box-shadow阴影组件封装,可自动适应内容宽高。
    首先要安装react-native-shadow
    yarn add react-native-shadow
    然后安装一个react-native-svg,注意要去github上看下版本对照表,要对应版本安装
    yarn add react-native-svg/yarn add react-native-svg@x.x.x

    封装:

    import React from 'react'
    import {
      ViewStyle
    } from 'react-native'
    import Base from '@/components/Base';
    import { View } from '@/components';
    import { BoxShadow as RNBoxShadow, BoxShadowType } from "react-native-shadow";
    
    interface Props {
      data?: any   //用来控制重新渲染高度
      style?: ViewStyle
      color?: string
      shadowOption?: {
        border?: number;    // the width of shadow , cannot less than 0
        radius?: number;    // the same value as the "borderRadius" of chileElement
        opacity?: number;   // the opacity of shadow
        x?: number;         // the offsetX of shadow
        y?: number;         // the offsetY of shadow
        style?: ViewStyle;     // the style you want to add to the wrapper box
      }
      children?: React.ReactNode;
    }
    
    interface State {
      contentHeight: number
      contentWidth: number
      showShadow: boolean
    }
    /**
     * box-shadow组件,包裹在需要阴影的View外
     * @param {string} color  阴影颜色
     * @param {Object} shadowOption  阴影配置
     * @param {*} data  触发重新渲染的props,用来重新计算宽高
     * **/
    export default class BoxShadow extends Base<Props, State> {
    
      public state: State = {
        contentHeight: 0,
        contentWidth: 0,
        showShadow: false
      };
    
    
      public componentDidMount() {
    
      }
    
      public componentWillReceiveProps(nextProps:any) {
        if(nextProps.hasOwnProperty('data') && 
          JSON.stringify(this.props.data) != JSON.stringify(nextProps.data)
        ) {
          // reRender
          this.setState({
            showShadow: false
          })
        }
      }
    
      render() {
        const { color, style, shadowOption } = this.props;
    
        if (!this.state.showShadow) {
          return (
            <View style={style}
              onLayout={e => {
                const layout = e.nativeEvent.layout
                // console.log(layout)
                this.setState({
                  contentWidth: layout.width,
                  contentHeight: layout.height,
                  showShadow: true
                })
              }}
            >
              {this.props.children}
            </View>
          )
        }
    
        return (
          <RNBoxShadow
            setting={{
              height: this.state.contentHeight,
              width: this.state.contentWidth,
              color: color || '#000',
              border: shadowOption?.border || 5,
              radius: shadowOption?.radius || 5,
              opacity: shadowOption?.opacity || 0.2,
              x: shadowOption?.x || 0,
              y: shadowOption?.y || 0,
              style: shadowOption?.style || {},
            }}
          >
            <View style={style}>
              {this.props.children}
            </View>
          </RNBoxShadow>
        );
      }
    }
    export { BoxShadow };
    
    

    使用:

    import { BoxShadow, View, Text } from "@/components";
    
    //...
    render() {
      const { info } = this.state
      return (
        <BoxShadow data={info} shadowOption={{
          border: 10,
          opacity: 0.5
        }}>
          <View style={{backgroundColor: '#fff'}}>
           <Text>{info}</Text>
          </View>
        </BoxShadow>
      )
    }
    

    相关文章

      网友评论

          本文标题:React Native通用组件封装(BoxShadow)

          本文链接:https://www.haomeiwen.com/subject/etmhqdtx.html