index.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import React, { useReducer, useEffect, useState, Fragment } from 'react'
  2. import { RouteComponentProps } from 'react-router'
  3. import { reducer, initialState, getLayersAction, updateLayerAction, saveLayersAction, Item } from './reducer'
  4. import VectorShow from '../components/VectorShow'
  5. type Attr = 'lineColor' | 'lineWidth' | 'fillColor'
  6. function StyleEdit(props: RouteComponentProps) {
  7. let [state, dispatch] = useReducer(reducer, initialState)
  8. let layers = Object.keys(state)
  9. let [layer, setLayer] = useState('')
  10. let params = props.match.params as any
  11. let style = (layer && state[layer]) as Item
  12. useEffect(() => { getLayersAction(dispatch, params.id) }, [params.id])
  13. useEffect(() => { layer || setLayer(layers[0]) }, [layer, layers])
  14. const changeHandle = (attr: Attr) => (ev: React.ChangeEvent<HTMLInputElement>) => {
  15. updateLayerAction(dispatch, layer, { ...style, [attr]: ev.target.value })
  16. }
  17. const saveHandle = () => { saveLayersAction(style, params.id) }
  18. const verctorInfo = style && { ...style, url: style.getUrl }
  19. return (
  20. <div>
  21. <select value={layer} onChange={ev => setLayer(ev.target.value)}>
  22. {layers.map(layer => <option value={layer} key={layer}>{layer}</option>)}
  23. </select>
  24. {style && (
  25. <Fragment>
  26. <input type="color" value={style.fillColor} onChange={changeHandle('fillColor')} />
  27. <input type="color" value={style.lineColor} onChange={changeHandle('lineColor')} />
  28. <input type="number" value={style.lineWidth} onChange={changeHandle('lineWidth')} />
  29. <button onClick={saveHandle}>保存</button>
  30. </Fragment>
  31. )}
  32. {style && <VectorShow {...verctorInfo} height={2500} />}
  33. </div>
  34. )
  35. }
  36. export default StyleEdit