Form组件和react-json-view一起用无法正常显示

react 中 对 JSON 对象 数据的展示和操作

在 react hook 项目当中,最近遇到一个需求,就是后端有一些配置需要我们展示 一个 JSON 对象,使用 react-json-view 就可以完成了。

上代码:

首先是安装

yarn install react-json-view

接着是展示json数据:(从后端获取json展示)

// 1.导入
import ReactJson from 'react-json-view';

// 2.这个组件,有很多 api,其中 src 是必传项,所以定义一个src就可以了;
  const [jsonValue, setJsonValue] = useState({});

// 3.获取到后端给我们的数据,拿到后端返回的 json 字符串
const getDate = () => {
    getMetaDateList().then((res) => {
        setJsonValue(JSON.parse(res.data.data));
    })
}
// 4.直接当组件使用
return (
	<ReactJson src={jsonValue}></ReactJson>
)

然后是编辑 json 数据: (传给后端数据)

这里遇到一个坑

当antd 的 form 和 ReactJson 一起使用的时候,Json中的value展示失败的问题

// 下面是部分代码
import ReactJson from 'react-json-view';

  const [jsonValue, setJsonValue] = useState([]);

  const onAdd = (add: ISafeAny) => {
    console.log('add',add)
    setJsonValue(add.updated_src)
  }

  const onEdit = (edit: ISafeAny) => {
    console.log('Edit', edit.updated_src)
    setJsonValue(edit.updated_src);
  }

  const onDelete = (arr: ISafeAny) => {
    console.log('Delete', arr)
    setJsonValue(arr.updated_src)
  }
  
// 下面是 return 中的部分代码
  return (
    <Modal title='新增元数据' visible = {visible} onCancel={onCancel} onOk={AddMetaDate}>
      <Form form={form} layout='horizontal' labelCol={{ span: 4 }}>
        <Form.Item name = 'key' label='元数据名'>
          <Input placeholder='请输入' className={styles['form-item-list']} />
        </Form.Item>
        <Form.Item name = 'type' label='元数据类型'>
          <Radio.Group onChange={onTypeChange}>
            <Radio value='String'>string类型</Radio>
            <Radio value='JSON'>JSON类型</Radio>
          </Radio.Group>
        </Form.Item>
        <Form.Item name = 'value' label='元数据值' >
          {metaType === 'String' ? 
          <Input placeholder='请输入' className={styles['form-item-list']} /> : 
          <ReactJson src={jsonValue} onAdd={onAdd} onEdit={onEdit} onDelete={onDelete}></ReactJson>}
        </Form.Item>
      </Form>
    </Modal>
  );

很明显,我们要的效果实现了,但是有个问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fRhDUCCF-1676978989697)(C:\Users\wjj\AppData\Roaming\Typora\typora-user-images\image-20230221191840546.png)]
这是输入过程中,输入的 value 值

当我们点击 绿色勾 后,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KN5emkQr-1676978989698)(C:\Users\wjj\AppData\Roaming\Typora\typora-user-images\image-20230221191953576.png)]

只显示了,名 和 值的类型,并没有展示 值

正常情况应该是
在这里插入图片描述
这里的 onEdit 回调中,打印的内容也是,修改后有 value 的

在这里插入图片描述

问题原因:

在官方文档中我们可以找到

被设置了 name 属性的 Form.Item 包装的控件,表单控件会自动添加 value(或 valuePropName 指定的其他属性) onChange(或 trigger 指定的其他属性)

所以 有可能是注入的 value 在 ReactJson 当中与展示过程中某个 value 冲突了,所以才会导致展示不出来

解决办法:

因为 Form.Item 只会给它包裹的第一层自动添加属性,所以我们只需要多包裹一层即可

// 下面是 return 中的代码
  return (
    <Modal title='新增元数据' visible = {visible} onCancel={onCancel} onOk={AddMetaDate}>
      <Form form={form} layout='horizontal' labelCol={{ span: 4 }}>
        <Form.Item name = 'key' label='元数据名'>
          <Input placeholder='请输入' className={styles['form-item-list']} />
        </Form.Item>
        <Form.Item name = 'type' label='元数据类型'>
          <Radio.Group onChange={onTypeChange}>
            <Radio value='String'>string类型</Radio>
            <Radio value='JSON'>JSON类型</Radio>
          </Radio.Group>
        </Form.Item>
        <Form.Item name = 'value' label='元数据值' >
          {metaType === 'String' ? 
          <Input placeholder='请输入' className={styles['form-item-list']} /> : 
          (<div>
            <ReactJson src={jsonValue} onAdd={onAdd} onEdit={onEdit} onDelete={onDelete}></ReactJson>
          </div>)}
        </Form.Item>
      </Form>
    </Modal>
  );

这样就可以保证正常的展示 value 了。
在这里插入图片描述
搞定!

下面是react-json-view 库提供的api :

属性名值类型默认值描述
src(必须)JSON Object需要展示的JSON数据
namestring或falserootJSON数据的根节点(用默认或指定的根节点包裹自己的数据),使用null或false没有名字
themestringrjv-defaultRJV支持base-16主题。具体的看后面
styleobject{}可以通过style添加、修改样式,可覆盖主题默认提供的属性
iconStylestringtriangle接受参数:circle(圆)、triangle(三角形)、square(圆)
indentWidthinteger(整数)4JSON嵌套对象的缩进值
collapsedboolean或integerfalse当设置为true,默认情况下,所有节点都将被折叠。使用整数值在特定深度折叠。
collapseStringsAfterLengthintegerfalse这个就是超出内容会变成…的功能。当一个整数值被赋值时,字符串就会在这个长度后面接上省略号。可以通过单击字符串值来展开和折叠字符串内容
shouldCollapse(field)=>{}false回调函数来提供对默认情况下应该折叠的对象和数组的控制。对象被传递给包含name, src, type(“数组”或“对象”)和namespace
displayObjectSizebooleantrue当设置为true,对象和数组被标记为大小。例如: { a: 'a1',b: 'b1' },会显示2 items
displayDataTypesbooleantrue当设置为true,数据类型会出现在数据的前缀值.例如: { a: 123, b: 'b1'},会显示{ a: int 123, b: string 'b1'}
onEdit(edit)=>{}false当传入回调函数时,edit功能已启用。在编辑完成之前调用回调。详见《rjv-onEdit》
onAdd(add)=>{}false当传入回调函数时,add功能已启用。在完成添加之前调用回调。《rjv-onAdd》
onDelete(delete)=>{}false }当传入回调函数时,delete功能已启用。在完成删除之前调用回调。《rjv-onDelete》
onSelect(select)=>{}false当传入函数时,单击值将触发onSelect方法将被调用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值