npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-native-easy-app

v1.7.27

Published

one-stop solution for react-native

Downloads

32

Readme

react-native-easy-app (React Native One-stop solution)

查看中文文档

Installation

npm install react-native-easy-app --save

or

yarn add react-native-easy-app

Features

  • Support for fast synchronous access to AsyncStorage
  • Support for flexible Http requests through optional configuration
  • Support for Flexible base widget (no sensory multi-screen adaptation)

Usage

For detailed usage, please refer to the example project Sample, Sample_MobX, Sample_Redux, Sample_Hook

You can also refer to the introduction of react-native-easy-app article : 简书

  • Implement a persistent data store manager ( based AsyncStorage )

       export const RNStorage = {// RNStorage : custom data store object
           token: null, // string type
           isShow: null, // bool type
           userInfo: null, // object type
       };
      import { XStorage } from 'react-native-easy-app';
      import { AsyncStorage } from 'react-native';
            
      XStorage.initStorage(RNStorage, AsyncStorage, () => {
          ... // RNStorage 【Property access code snippet】
      });
           
      // OR ---------------------------------------------------------------
           
      const result = await XStorage.initStorageSync(RNStorage, AsyncStorage);
      if (result) {
          ... // RNStorage 【Property access code snippet】
      }
                   
     // RNStorage 【Property access code snippet】
          
     // From now on, you can write or read the variables in RNStorage synchronously
          
     console.log(RNStorage.isShow);
     // equal to [console.log(await AsyncStorage.getItem('isShow'))] 
           
     RNStorage.token = 'TOKEN1343DN23IDD3PJ2DBF3==';
     // equal to [ await AsyncStorage.setItem('token',TOKEN1343DN23IDD3PJ2DBF3==') ]  
          
     RNStorage.userInfo = {name: 'rufeng', age: 30};
     // equal to [ await AsyncStorage.setItem('userInfo',JSON.stringify({ name:'rufeng', age:30})) ]  

    XStorage Object

    | Method | param | ReturnType | Description | | ----------------------|:----------------------------------------------------------------|:-----------------------------:| :-----------------------------------------------------------------------| | initStorage | (storageObj, storageImp, initCallback, dataCallback?) | void | Establish the mapping relationship between storageObj and AsyncStorage | | initStorageSync | (storageObj, storageImp, dataCallback?) | Promise | Establish the mapping relationship between storageObj and AsyncStorage | | | multiGet | keys :string[] | Promise<[string, string][]> | equal to AsyncStorage.multiGet() | | saveItems | keyValuePairs :string[][] | Promise | equal to AsyncStorage.multiSet() | | removeItems | keys :string[] | Promise | equal to AsyncStorage.multiRemove() | | clear | none | void | equal to AsyncStorage.clear() |

    XStorage.initStorage parameters

    | Parameter Name | required | mode | Description | | ------------------------------------------|:-----------:|:---------------------------------------------:| :---------------------------------------------| | storageObj :object | true | { token:undefined, userName:undefined, ...} | list of data that needs to be persisted | | storageImp :AsyncStorage | true | AsyncStorage | data Persistence Implementation Carrier | | initializedFunc :callback function | true | ()=>{ ... } | callback after persistent mapping success |
    | dataChangedFunc ?:callback function | false | (dataSet)=>{ ... } | persistent data change callback |

    Note: If the React Native version of the project is higher than 0.60, the parameters of storageImp, it is recommended to use the [AsyncStorage] instance in '@react-native-community/async-storage'

  • Configurable Http request framework

    • All based on configuration (configuration optional, free to set)
    import { XHttpConfig, XHttpConst } from 'react-native-easy-app';
         
    XHttpConfig().initLogOn(true)
                 .initBaseUrl('https://www.baidu.com')
                 .initTimeout(15000)
                 .initContentType(XHttpConst.CONTENT_TYPE_URLENCODED)
                 .initLoadingFunc((isLoading)=>{
                    ...
                 })
                 .initHeaderSetFunc((headers, request) => {
                    ...
                 })
                 .initParamSetFunc((params, request) => {
                    ...
                 })
                 .initParseDataFunc((result, request, callback) => {
                    let {success, json, response, message, status} = result;
                    ...
                  }
             );

    XHttpConfig Object (All method are optional)

    | Method | param | ReturnType | Description | | -------------------------|:------------------------------------------------------|:----------------------:| :-----------------------------------------------------------------------------------------------------| | constructor | serverTag ?:string | XHttpConfig Builder | Corresponding to the server serverTag of XHttp | | initBaseUrl | baseUrl :string | XHttpConfig Builder | set baseUrl | | initTimeout | timeout :number | XHttpConfig Builder | set common timeout | | initLogOn | logOn :bool | XHttpConfig Builder | set print request log or not | | initContentType | contentType :string | XHttpConfig Builder | set common contentType | | initLoadingFunc | (isLoading) => {...} | XHttpConfig Builder | callback http request loading status | | initHeaderSetFunc | (headers, request) => {...} | XHttpConfig Builder | Intercept header settings | | initParamSetFunc | (params, request) => {...} | HttpRequest Builder | Intercept params settings | | initParseDataFunc | (result, request, callback) => {...} | XHttpConfig Builder | Intercept interface returns data parsing | | initEncodeURIComponent | encodeComponent :boolean | HttpRequest Builder | Set common parameters(body) URL encoding,while contentType is [application/x-www-form-urlencoded] | | initNetworkExceptionFunc | (NetInfo,(message, code) => {...}) | HttpRequest Builder | Provide the request library with a tool library to check the current network status (an instance object of @react-native-community/netinfo) [require => android.permission.CHANGE_NETWORK_STATE] |

  • Send request template

       import { XHttp } from 'react-native-easy-app';
         
       let url = 'v1/account/login/';
       let param = { phone: '18600000000', authCode: '123456'};
       let header = { Authorization: "Basic Y3Rlcm1pbmF......HcVp0WGtI"};
       let callback = () => (success, json, message, status, respoonse) => {
            if (success) {
               showToast(JSON.stringify(json))
            } else {
               showToast(msg)
            }
       };
         
       * Settable parameters are spliced in builder form
       XHttp().url(url)
           .header(header)
           .param(param)
           .internal(true)
           .rawData()
           .pureText()
           .timeout(10000)
           .extra({tag: 'xx'})
           .contentType('text/xml')
           .loadingFunc((loading)=> showLoading('Please wait for a moment ...', loading))
           .rawData()
           .pureText()
           .configCommonFunc(true,true)
           .[formJson|formData|formEncoded]()
           .[get|post|put|patch|delete|options](callback);
           

    HttpRequest Object

    | Method | params | ReturnType | Description | | ----------------------|:-----------------------------------------------------------------|:---------------------:|:--------------------------------------------------------------------------------------| | constructor | serverTag :string | HttpRequest Builder | Corresponding to the server serverTag of XHttpConfig | | url | url :string | HttpRequest Builder | set full url or url suffixes | | header | { Accept, Authorization ... } :object | HttpRequest Builder | Set the headers parameters | | param | { userName,... } or FormData :object | HttpRequest Builder | Set the body parameters | | paramRaw | { userName,... } or FormData :object | HttpRequest Builder | Set the body parameters (paramRaw will be passed directly to the body of fetch) | | contentType | contentType :string | HttpRequest Builder | set current request contentType (common contentType Settings will be replaced) | | internal | internal :bool | HttpRequest Builder | set request tag (default true), And then you can get it anywhere there's a request | | extra | {customTag ...} | HttpRequest Builder | set request custom tag And then you can get it anywhere there's a request | | timeout | timeout :number | HttpRequest Builder | set current request timeout (common timeout Settings will be replaced) | | loadingFunc | (isLoading)=>{ ... } | HttpRequest Builder | request status callback (Reflects the status is loading or not) | | configCommonFunc |( enableHeaderFunc :bool, enableParamFunc :bool ) | HttpRequest Builder | set common config [initHeaderSetFunc] [initParamSetFunc] are valid or not | | rawData | none | HttpRequest Builder | Sets the callback result to return raw json ([initParseDataFunc] will be ignored) | | pureText | none | HttpRequest Builder | Set the callback result to return plain text | | formJson | none | HttpRequest Builder | equal to set ( headers['Content-Type'] = 'application/json' ) | | formData | none | HttpRequest Builder | equal to set ( headers['Content-Type'] = 'multipart/form-data' ) | | formEncoded | none | HttpRequest Builder | equal to set ( headers['Content-Type'] = 'application/x-www-form-urlencoded' ) | | get |(success, json, message, status ,response) => void | void | [get] request callback | | post |(success, json, message, status ,response) => void | void | [post] request callback | | options |(success, json, message, status ,response) => void | void | [options] request callback | | put |(success, json, message, status ,response) => void | void | [put] request callback | | delete |(success, json, message, status ,response) => void | void | [delete] request callback | | patch |(success, json, message, status ,response) => void | void | [patch] request callback | | request |(method, (success, json, message, status ,response) => void ) | void | request callback for specified method | | execute | method :string | Promise | request for the specified method returned in the form of a promise | | fetch | method :string | Promise | returns a fetch result without any processing |

    new HttpRequest() ==> XHttp()

    It is recommended that it be more convenient to send requests using XHttp()

  • request-send

    • synchronous request
       import { XHttp } from 'react-native-easy-app';
            
       const url = 'https://www.google.com';
           
       const result = await XHttp().url(url).execute('GET');
       const {success, json, message, status, response} = result;
            
       if(success){
          this.setState({content: JSON.stringify(json)})
       } else {
          showToast(message)
       }
    • asynchronous request mode 1
       XHttp().url(url).get((success, json, message, status, response)=>{
           if (success){
              this.setState({content: JSON.stringify(json)});
           } else {
              showToast(msg);
           }
       });
    • asynchronous request mode 2
       XHttp().url(url).execute('GET').then(({success, json, message, status, response}) => {
           if (success) {
                this.setState({content: JSON.stringify(json)});
           } else {
                showToast(message);
           }
        })
  • Flexible base widget

       XView
       XImage
       XText
            
       XFlatList
            
       XWidget
       .initResource(AssetsBaseUrl)    // The uri prefix of the icon attribute of the XImage component
       .initReferenceScreen(375, 677); // The component scales the reference screen size

    XView, XImage, and XText all contain the raw attribute. If the raw value is true, the setting of XWidget.initReferenceScreen (referenceWidth, referenceHeight) is ignored: multi-screen size adaptation is not automatically processed

    XView Object

    | Property | type | Description | | ------------|:-----------:|:-------------------------------------------------------------------------------------------------------------------------------------------| | raw | bool | default:false, if true, the multi-screen adaptation function will be disabled. | | ... | ... | If the onPress or onLongPress property is included, it has the same property as TouchableXXX, otherwise it has the same property as View |

    XImage Object

    | Property | type | Description | | ----------------------|:----------------:| :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | raw | bool | default:false, If true, the multi-screen adaptation function will be disabled. | | icon | string | equivalent to Image's srouce attribute,Can accept such as [https://xxx.yy.com/../image.jpg], [data: image / png; base64, iVBORw0KGgoAAAAN ...] or [require ('./ image.jpg')] | | iconSize | number | the size of the image has priority over the width and height of the style | | ... | ... | if the onPress and onLongPress functions are set, XImage will be wrapped by XView, and the externally passed properties will be automatically assigned to the correct control |

    XText Object

    | Property | type | Description | | ----------------------|:----------------:| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | raw | bool | default:false, If true, the multi-screen adaptation function will be disabled. | | text | string | text | | textExtend | bool | if the icon is included, it is equivalent to setting the property of the Text component: {flex: 1} | | icon | string | equivalent to Image's srouce attribute,Can accept such as [https://xxx.yy.com/../image.jpg], [data: image / png; base64, iVBORw0KGgoAAAAN ...] or [require ('./ image.jpg')]| | resizeMode | string | icon resizeMode | | iconSize | number | icon size | | iconStyle | object | icon style | | iconMargin | number | distance between icon and text | | iconPosition | string | the position of the icon in the View, only the following values can be set: 'top', 'right', 'bottom', 'left' | | ... | ... | if the onPress and onLongPress functions are set, XText will be wrapped by XView, and the externally passed properties will be automatically assigned to the correct control|

    XFlatList Object

    | Property | type | Description | | ----------------------|:-----------------------------:| :-------------------------------------------------------------------------------------------------------| | data | array | equivalent to data of FlatList control | | refreshStatus | object | XFlatList list displays UI styles and text setting objects in different refresh states | | indicatorProps | object | set the style and attributes of RefreshControl | | onRefresh | () => {...} | equivalent to onRefresh of FlatList control | | onLoadMore | () => {...} | When the list scrolls to the bottom, the callback method is executed (when more data needs to be loaded)| | renderEmptyViewFunc | (status, isEmpty) => {...} | Customize the realization of EmptyView in various states | | renderRooterViewFunc | (status, isEmpty) => {...} | Customize the implementation of RooterView in various states | | ... | ... | all remaining properties of [FlatList] component |

    FlatList component refreshStatus attribute example

     const RefreshStatus = {
       Idle: {}, //idle status
          
       RefreshingData: {  text: 'Loading...' }, // Pull-down refresh..
       NoData: {  text: 'No data' }, // To drop down to refresh (no data).
       LoadFailure: {  text: 'Failed to load' }, // Drop-down refresh (load failed)
          
       LoadingMoreData: { moreText: 'Loading more data…' }, // Load more, in progress...
       NoMoreData: { moreText: 'No more data' }, // Load more (no data)
       LoadMoreFailure: { moreText: 'Click to reload' }, // Load more (load failed)
            
       NetException: {text: 'network exception', moreText: 'Network exception, click reload'}, // network exception
     }

For detailed usage, please refer to the example project Sample, Sample_MobX, Sample_Redux, Sample_Hook

You can also refer to the introduction of react-native-easy-app article : 简书

Version log

  • 1.7.0 XStorage initialization adds required parameter storageImp (AsyncStorage instance)
  • 1.7.4 Set the default timeout of XHttpConfig to 15 seconds; update the readme file and add XStorage synchronization initialization code snippets.
  • 1.7.5 Remove the parameter urlEncoded processing of specific request, only support global encoding or no encoding; fix the encoding processing under non-formEncoded type.
  • 1.7.6 Set the default contentType of XHttpConfig to application/x-www-form-urlencoded; set the default icon of XText to be at the top of the text.
  • 1.7.7 XText adds iconStyle and resizeMode attributes; XHttp common parameters add support for incoming FormData, the original parameter paramRaw supports sending the request directly without processing.
  • 1.7.8 Fix the bug that XImage does not support tintColor style when there is a click event.
  • 1.7.9 XFlatList adds ref attribute: ref => this.flatList = ref, so that XFlatList can support the related methods owned by FlatList, the usage is as follows: this.refreshList.flatList.scrollToOffset({...}).
  • 1.7.12 When the request is successful, the meaningless timeout timer is cleared in time to reduce unnecessary waste of timer resources.
  • 1.7.13 XFlatList adds attributes renderFooter, indicatorProps to control its style and attributes more flexibly.
  • 1.7.16 XFlatList adds attributes such as indicatorProps, renderEmptyViewFunc, renderRooterViewFunc, etc., which can customize the layout of indicator, emptyView in various states and rooterView
  • 1.7.17 XFlatList adds attribute renderPreEmptyViewFunc, which is used to customize the layout of EmptyView when the list is not loaded with any data.
  • 1.7.18 HttpConfig adds the initNetworkExceptionFunc method, through the @react-native-community/netinfo instance object specified by the user, the corresponding callback processing is done according to the current network status when requesting
  • 1.7.19 XFlatList merges renderPreEmptyViewFunc into renderEmptyViewFunc method, removes XText’s default support for allowFontScaling
  • 1.7.20 Fix the bug that the judgment condition of the screen adaptation method validReferSize is wrong
  • 1.7.23 Removed unnecessary data type conversion implementation when XStorage reads data from persistence to memory
  • 1.7.25 Compatible XStorage data storage can not effectively handle the bug of undefined type data (an exception will be reported on IOS)
  • 1.7.26 Rename the XHttpConfig method initHttpLogOn to initLogOn, rename the XFlatList method renderRooterViewFunc to renderFooterViewFunc, modify the readme document description