leancloud 使用了 七牛云提供的图片处理api
只要在生成的 url 后面加上如下图所示的后缀就能对图片进行裁剪
image.png
因此我们只需要添加2个 input 输入框,监听输入,同时修改 url 后缀即可
image.png
注意下面的代码中使用了 mobx-react 提供的 useLocalStore 创建组件内局部状态

  1. import { observer, useLocalStore } from 'mobx-react'
  2. // ...
  3. const Uploader = observer(() => {
  4. const { ImageStore } = useStore()
  5. const resizeUrlRef = useRef() as MutableRefObject<HTMLInputElement>
  6. const widthRef = useRef() as MutableRefObject<HTMLInputElement>
  7. const heightRef = useRef() as MutableRefObject<HTMLInputElement>
  8. const store = useLocalStore(() => ({
  9. width: '',
  10. setWidth() {
  11. store.width = widthRef.current.value
  12. },
  13. get widthStr() {
  14. return store.width ? `/w/${store.width}` : ''
  15. },
  16. height: '',
  17. setHeight() {
  18. store.height = heightRef.current.value
  19. },
  20. get heightStr() {
  21. return store.height ? `/h/${store.height}` : ''
  22. },
  23. get fullStr() {
  24. return (
  25. ImageStore.serverFile.attributes.url.attributes.url +
  26. '?imageView2/0' +
  27. store.widthStr +
  28. store.heightStr
  29. )
  30. },
  31. }))
  32. // ...
  33. return (
  34. <>
  35. {/* ... */}
  36. <div>
  37. {ImageStore.serverFile ? (
  38. <Result>
  39. <dl>
  40. <dt>自定义尺寸</dt>
  41. <dd className="resize">
  42. <input type="text" placeholder=" 宽度(可选)"
  43. value={store.width}
  44. ref={widthRef}
  45. onChange={() => store.setWidth()}
  46. />{' '}
  47. -{' '}
  48. <input
  49. type="text" placeholder=" 高度(可选)"
  50. ref={heightRef}
  51. value={store.height}
  52. onChange={() => store.setHeight()}
  53. />
  54. </dd>
  55. <dd>
  56. <input type="text" className="filename" readOnly ref={resizeUrlRef} value={store.fullStr} />
  57. </dd>
  58. </dl>
  59. </Result>
  60. ) : (
  61. ''
  62. )}
  63. </div>
  64. </>
  65. )
  66. })
  67. export default Uploader

让 input 只能输入数字

让 input 只能输入数字,且不能以 0 开头
利用受控组件的特性,input 的 value 只能在 onChange 事件中修改,通过正则表达式判断,符合规则才修改 value

  1. <input
  2. type="text"
  3. placeholder=" 高度(可选)"
  4. ref={heightRef}
  5. value={store.height}
  6. onChange={(e) => {
  7. if (
  8. e.target.value === '' ||
  9. /^[1-9][0-9]*$/.test(e.target.value)
  10. ) {
  11. store.setHeight()
  12. }
  13. }}
  14. />