Parcourir la source

Merge branch 'master' of http://git.ycjcjy.com/pet_identity/miniapp

李志伟 il y a 3 ans
Parent
révision
8085451b0d
6 fichiers modifiés avec 144 ajouts et 34 suppressions
  1. 1
    0
      config/index.js
  2. 1
    0
      package.json
  3. 35
    0
      src/components/Form/index.jsx
  4. 61
    0
      src/components/Picker/index.jsx
  5. 26
    29
      src/pages/setUser/index.jsx
  6. 20
    5
      yarn.lock

+ 1
- 0
config/index.js Voir le fichier

@@ -15,6 +15,7 @@ const config = {
15 15
   alias: {
16 16
     '@/assets': path.resolve(__dirname, '..', 'src/assets'),
17 17
     '@/components': path.resolve(__dirname, '..', 'src/components'),
18
+    '@/store': path.resolve(__dirname, '..', 'src/store'),
18 19
     '@/services': path.resolve(__dirname, '..', 'src/services'),
19 20
     '@/utils': path.resolve(__dirname, '..', 'src/utils')
20 21
   },

+ 1
- 0
package.json Voir le fichier

@@ -41,6 +41,7 @@
41 41
     "@tarojs/runtime": "3.3.6",
42 42
     "@tarojs/taro": "3.3.6",
43 43
     "@zjxpcyc/react-tiny-store": "^1.0.0",
44
+    "async-validator": "^4.1.1",
44 45
     "react": "^17.0.0",
45 46
     "react-dom": "^17.0.0"
46 47
   },

+ 35
- 0
src/components/Form/index.jsx Voir le fichier

@@ -0,0 +1,35 @@
1
+import Taro from '@tarojs/taro';
2
+import { Form } from '@tarojs/components';
3
+import Schema from 'async-validator';
4
+
5
+// 支持验证规则的表单
6
+// 验证规则同 ant design 一致
7
+export default function (props) {
8
+  const { onSubmit, onError, rules, ...leftProps } = props
9
+
10
+  const handleSubmit = (e) => {
11
+    if (!rules) {
12
+      if (onSubmit) {
13
+        onSubmit(e.detail.value)
14
+      }
15
+      return;
16
+    }
17
+
18
+    const validator = new Schema(rules);
19
+    validator.validate(e.detail.value).then(() => {
20
+      if (onSubmit) {
21
+        onSubmit(e.detail.value)
22
+      }
23
+    }).catch((...args) => {
24
+      if (onError) {
25
+        onError(...args)
26
+      }
27
+    })
28
+  }
29
+
30
+  return (
31
+    <Form {...leftProps} onSubmit={handleSubmit} >
32
+      {props.children}
33
+    </Form>
34
+  )
35
+}

+ 61
- 0
src/components/Picker/index.jsx Voir le fichier

@@ -0,0 +1,61 @@
1
+import Taro from '@tarojs/taro';
2
+import { Picker, View } from '@tarojs/components';
3
+import { useMemo, useState } from 'react';
4
+import PropTypes from 'prop-types';
5
+
6
+// 暂时只支持单列普通选择器
7
+const XPicker = (props) => {
8
+  const { bindchange, onChange, range, value : propValue, rangeKey, rangeValue, placeholder = '请选择', ...leftProps } = props
9
+
10
+  const [innerValue, setInnerValue] = useState()
11
+
12
+  const handleChange = (e) => {
13
+    const data = range[e.detail.value]
14
+    const val = data[rangeValue]
15
+    e.detail.value = val
16
+    setInnerValue(data)
17
+
18
+    console.log('-----bindchange----->', bindchange)
19
+    console.log('-----onChange----->', onChange)
20
+
21
+    if (bindchange) {
22
+      bindchange(e, data)
23
+    }
24
+    if (onChange) {
25
+      onChange(e, data)
26
+    }
27
+  }
28
+
29
+  const value = useMemo(() => {
30
+    if (propValue === undefined || propValue === null) {
31
+      return undefined
32
+    }
33
+
34
+    for (let i in range) {
35
+      if (range[i][rangeValue] === propValue) {
36
+        setInnerValue(range[i])
37
+        return i;
38
+      }
39
+    }
40
+
41
+    return undefined;
42
+  }, [propValue, range, rangeValue])
43
+
44
+  const childViewStyle = useMemo(() => {
45
+    return innerValue ? {} : { color: '#858585' }
46
+  }, [innerValue])
47
+
48
+  return (
49
+    <Picker {...leftProps} mode='selector' range={range} value={value} rangeKey={rangeKey} onChange={handleChange}>
50
+      <View style={childViewStyle}>{innerValue === undefined ? placeholder : innerValue[rangeKey]}</View>
51
+    </Picker>
52
+  )
53
+}
54
+
55
+XPicker.behaviors = ['wx://form-field']
56
+XPicker.propTypes = {
57
+  behaviors: PropTypes.array
58
+}
59
+
60
+
61
+export default XPicker

+ 26
- 29
src/pages/setUser/index.jsx Voir le fichier

@@ -1,9 +1,11 @@
1
-import { View, Button, Form, Text, Image, Picker, Switch, Input, Radio, Label, ScrollView } from '@tarojs/components'
1
+import { View, Button, Text, Image, Switch, Input, Radio, Label, ScrollView } from '@tarojs/components'
2 2
 import Taro from '@tarojs/taro';
3 3
 import { useEffect, useState } from 'react';
4
-import { setPersons } from '../../services/dogAPI';
5
-import { useModel } from '../../store';
6
-import { uploadFile } from '../../utils/request';
4
+import { setPersons } from '@/services/dogAPI';
5
+import { useModel } from '@/store';
6
+import { uploadFile } from '@/utils/request';
7
+import Form from '@/components/Form';
8
+import Picker from '@/components/Picker';
7 9
 
8 10
 import './style.less'
9 11
 
@@ -35,24 +37,24 @@ export default (props) => {
35 37
 
36 38
   }
37 39
   const formSubmit = e => {
38
-    const formData = e.detail.value
40
+    const formData = e
39 41
     console.log(e)
40 42
 
41
-    // setPerson
42
-    setPersons({ ...userInfo, ...formData, sex: userSex[formData.sex].value, }).then((e) => {
43
-      console.log('e', e);
44
-      setPerson(e)
45
-      Taro.showToast({
46
-        title: '保存成功',
47
-        icon: 'none',
48
-        duration: 1000
49
-      })
50
-      setTimeout(() => {
51
-        Taro.navigateBack({
52
-          delta: 1
53
-        })
54
-      }, 600);
55
-    })
43
+    // // setPerson
44
+    // setPersons({ ...userInfo, ...formData, sex: userSex[formData.sex].value, }).then((e) => {
45
+    //   console.log('e', e);
46
+    //   setPerson(e)
47
+    //   Taro.showToast({
48
+    //     title: '保存成功',
49
+    //     icon: 'none',
50
+    //     duration: 1000
51
+    //   })
52
+    //   setTimeout(() => {
53
+    //     Taro.navigateBack({
54
+    //       delta: 1
55
+    //     })
56
+    //   }, 600);
57
+    // })
56 58
   }
57 59
 
58 60
 
@@ -93,19 +95,15 @@ export default (props) => {
93 95
     }}
94 96
     >
95 97
       <View class='page' >
96
-        <Form onSubmit={formSubmit}  >
97
-          <mp-form  >
98
+        <Form onSubmit={formSubmit}>
99
+          <mp-form>
98 100
             <mp-cells title=' '>
99 101
               <mp-cell title='姓名' extClass=''>
100 102
                 <Input name='nickName' placeholder='请输入姓名' value={person?.nickName} />
101 103
               </mp-cell>
102 104
               <mp-cell title='性别' extClass=''>
103 105
                 {/* <Input name='sex' placeholder='请输入卡号' /> */}
104
-                <Picker name='sex' mode='selector' rangeKey='text' range={userSex} onChange={(e) => { handleSetUser('sex', e.detail.value) }}>
105
-                  <View className='picker'>
106
-                    {userInfo.sex == 1 ? '男' : userInfo.sex == 2 ? '女' : userInfo.sex}
107
-                  </View>
108
-                </Picker>
106
+                <Picker name='sex' rangeKey='text' rangeValue='value' range={userSex} />
109 107
               </mp-cell>
110 108
               <mp-cell title='手机号' extClass=''>
111 109
                 <Input name='phone' type='number' placeholder='请输入手机号' maxlength={11} value={person?.phone} />
@@ -123,10 +121,9 @@ export default (props) => {
123 121
                     <Image className='userImg1' name='cardImg1' src={userInfo.cardImg1} onClick={(e) => handleSetUser('img', e.detail.value)} />
124 122
                 }
125 123
               </mp-cell>
126
-
127 124
             </mp-cells>
128 125
           </mp-form>
129
-          <View slot='button' style={{ margin: '4em 0 2em 0' }}>
126
+          <View style={{ margin: '4em 0 2em 0' }}>
130 127
             <Button style={{ backgroundColor: '#fbd804', borderRadius: '40px', color: '#000', border: '0px' }} class='weui-btn' type='primary' loading={false} formType='submit'>确定</Button>
131 128
           </View>
132 129
         </Form>

+ 20
- 5
yarn.lock Voir le fichier

@@ -364,11 +364,16 @@
364 364
     chalk "^2.0.0"
365 365
     js-tokens "^4.0.0"
366 366
 
367
-"@babel/parser@^7.16.7", "@babel/parser@^7.18.0", "@babel/parser@^7.3.1", "@babel/parser@^7.7.0":
367
+"@babel/parser@^7.16.7", "@babel/parser@^7.18.0", "@babel/parser@^7.7.0":
368 368
   version "7.18.0"
369 369
   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.0.tgz#10a8d4e656bc01128d299a787aa006ce1a91e112"
370 370
   integrity sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==
371 371
 
372
+"@babel/parser@^7.3.1":
373
+  version "7.18.3"
374
+  resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.18.3.tgz#39e99c7b0c4c56cef4d1eed8de9f506411c2ebc2"
375
+  integrity sha512-rL50YcEuHbbauAFAysNsJA4/f89fGTOBRNs9P81sniKnKAr4xULe5AecolcsKbi88xu0ByWYDj/S1AJ3FSFuSQ==
376
+
372 377
 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12":
373 378
   version "7.17.12"
374 379
   resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e"
@@ -1173,9 +1178,9 @@
1173 1178
     regenerator-runtime "^0.13.4"
1174 1179
 
1175 1180
 "@babel/runtime@^7.7.2":
1176
-  version "7.18.2"
1177
-  resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.18.2.tgz#674575748fa99cf03694e77fc00de8e5117b42a0"
1178
-  integrity sha512-mTV1PibQHr88R1p4nH/uhR/TJ0mXGEgKTx6Mnd1cn/DSA9r8fqbd+d31xujI2C1pRWtxjy+HAcmtB+MEcF4VNg==
1181
+  version "7.18.3"
1182
+  resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4"
1183
+  integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==
1179 1184
   dependencies:
1180 1185
     regenerator-runtime "^0.13.4"
1181 1186
 
@@ -2771,6 +2776,11 @@ async-limiter@~1.0.0:
2771 2776
   resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
2772 2777
   integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
2773 2778
 
2779
+async-validator@^4.1.1:
2780
+  version "4.1.1"
2781
+  resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.1.1.tgz#3cd1437faa2de64743f7d56649dd904c946a18fe"
2782
+  integrity sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA==
2783
+
2774 2784
 async@^2.6.2:
2775 2785
   version "2.6.4"
2776 2786
   resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
@@ -3865,11 +3875,16 @@ camelize@^1.0.0:
3865 3875
   resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b"
3866 3876
   integrity sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==
3867 3877
 
3868
-caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001332:
3878
+caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001332:
3869 3879
   version "1.0.30001342"
3870 3880
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz#87152b1e3b950d1fbf0093e23f00b6c8e8f1da96"
3871 3881
   integrity sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA==
3872 3882
 
3883
+caniuse-lite@^1.0.30001109:
3884
+  version "1.0.30001343"
3885
+  resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001343.tgz#8e1107e30d9a4d2f63782b48ae0a3ce34e2f9c2a"
3886
+  integrity sha512-8KeCrAtPMabo/XW14B+R9sZYoClx1n0b+WYgwDKZPtWR3TcdvWzdSy7mPyFEmR5WU1St9v1PW6sdO5dkFOEzfA==
3887
+
3873 3888
 capture-stack-trace@^1.0.0:
3874 3889
   version "1.0.1"
3875 3890
   resolved "https://registry.npmmirror.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"