非受控组件 和 受控组件

非受控组件,值随着输入而变化,但不受上层控制。不能设置value,会导致无法修改值。

  1. import React, { useRef } from '@alipay/bigfish/react';
  2. export default () => {
  3. const inputRef = useRef(null);
  4. return (
  5. <div className="home-page">
  6. <input ref={inputRef} />
  7. <button onClick={() => {
  8. console.log('inputRef.current.value', inputRef.current.value);
  9. }}>Print</button>
  10. </div>
  11. );
  12. };

受控组件,初始值通过上层传递,输入内容会同步给上层,上层再将值传递给组件。zaizai值随着输入而变化,但不受上层控制。value的设置 和 onChange中修改value缺一不可。

  1. import React, { useRef, useState } from '@alipay/bigfish/react';
  2. export default () => {
  3. const inputRef = useRef(null);
  4. const [text, setText] = useState('hello');
  5. return (
  6. <div className="home-page">
  7. <input value={text} ref={inputRef} onChange={e=> setText(e.target.value) }/>
  8. </div>
  9. );
  10. };

React中的表单中自定义组件

以 antd-mobile 为例子:

  • 在表单中自定义组件需要使用 props.value 的值 和 通过props.onChange来传递值。
  • 使用上,我们通过 form.setFieldsValue设置、通过form.getFieldsValue获取。
  • 具体 Form.Item 怎么和 value 和 props.onChange打交道,可以再深入一些。
  1. <Form.Item noStyle name="topicId">
  2. <TopicSelector />
  3. </Form.Item>
  1. import React from '@alipay/bigfish/react';
  2. import { useModel } from '@alipay/bigfish';
  3. import { Space, Tag } from 'antd-mobile/2x';
  4. export default (props) => {
  5. const { initialState } = useModel('@@initialState');
  6. return (
  7. <Space align="start" wrap={true} style={{ '--gap': '0.16rem' }}>
  8. {initialState?.topicList.map((d) => {
  9. return (
  10. <span key={d.id} onClick={() => props.onChange(d.id)}>
  11. {props.value === d.id ? (
  12. <Tag
  13. color="primary"
  14. style={{ backgroundColor: 'rgba(25, 137, 250, 0.1)' }}
  15. fill="outline"
  16. >
  17. {d.name}
  18. </Tag>
  19. ) : (
  20. <Tag color="default" fill="outline">
  21. {d.name}
  22. </Tag>
  23. )}
  24. </span>
  25. );
  26. })}
  27. </Space>
  28. );
  29. };