0.0.3 • Published 5 years ago

react-query-to-state v0.0.3

Weekly downloads
5
License
MIT
Repository
github
Last release
5 years ago

react-query-to-state

Build Status

Mapping query string from the path to Component state seamlessly.

Installation

Use npm

npm install react-query-to-state

Use yarn

yarn add react-query-to-state

Usage

ES6 Class Component

import React from 'react'
import queryToStateHOC from 'react-query-to-state'
import { createBrowserHistory } from 'history'

class Searcher extends React.Component {
  handleChange = (event) => {
    const { updateQueryState } = this.props
    updateQueryState({ searchStr: event.target.value })
  }

  render () {
    const { query } = this.props
    const { searchStr } = query

    return (
      <div>
        <span>{searchStr}</span>
        <input onChange={this.handleChange} />
      </div>
    )
  }
}

const config = {
  history: createBrowserHistory(),  // optional
  initState: {
    searchStr: 'abcde'
  },
  validatorMap: {
    searchStr: [
      {
        type: 'regexp',
        value: /^abc/i
      }
    ]
  },
  isReplace: true
}

export default queryToStateHOC(Searcher, config)

Functional Component

import React from 'react'
import queryToStateHOC from 'react-query-to-state'

const Searcher = (props) => {
  const handleChange = (event) => {
    const { updateQueryState } = props
    updateQueryState({ searchStr: event.target.value })
  }

  const { query } = props
  const { searchStr } = query

  return (
    <div>
      <span>{searchStr}</span>
      <input onChange={handleChange} />
    </div>
  )
}

const config = {
  initState: {
    searchStr: ''
  }
}

export default queryToStateHOC(Searcher, config)

Multiple Components in one page

import React from 'react'
import queryToStateHOC from 'react-query-to-state'

class Searcher extends React.Component {
  render () {
    const { searchStr1 } = this.props
    return <div>{searchStr1}</div>
  }
}

const FunctionalSearcher = (props) => {
  const { searchStr2 } = props
  return <div>{searchStr2}</div>
}

const config1 = {
  initState: {
    searchStr1: 'str1'
  },
  validatorMap: {
    searchStr1: [
      {
        type: 'range',
        value: ['aaa', 'bbb']
      }
    ]
  }
}

const config2 = {
  initState: {
    searchStr2: 'str2'
  },
  validatorMap: {
    searchStr2: [
      {
        type: 'function',
        value: (val) => {
          return val.startsWith('test')
        }
      }
    ]
  }
}

const SearcherQueryToStateComp = queryToStateHOC(Searcher, config1)
const FunctionalSearcherQueryToStateComp = queryToStateHOC(FunctionalSearcher, config2)

export default class App extends React.Component {
  render () {
    return <React.Fragment>
      <SearcherQueryToStateComp />
      <FunctionalSearcherQueryToStateComp />
    </React.Fragment>
  }
}

Configuration

NameTypeDefaultDescription
historyobjectcreateBrowserHistory()Optional. History object, see history for more information.
isReplacebooleantrueOptional. If true, history.replace() will be called, or history.push() will be called when queryState is updated by component.
initStateobjectOnly properties declared in the initState object will be mapped from the path to Component state.
validatorMapobjectOptional. ValidatorMap is a dictionary of properties validators. The key is a property name, and the value is an array of validator for this property.

ValidatorMap

ValidatorMap is a dictionary of properties validators. The key is a property, and the value is an array of validator for this property.

validateTypes:

  • range
  • regexp
  • function
const validatorMap = {
  key1: [
    {
      type: 'range',
      value: ['aa', 'bb', 'cc']
    }
  ],
  key2: [
    {
      type: 'regexp',
      value: /^test/i
    },
    {
      type: 'function',
      value: val => {
        return val.endsWith('abc')
      }
    }
  ]
}