易者
易者
  • 发布:2023-03-14 18:00
  • 更新:2023-04-03 15:54
  • 阅读:584

【报Bug】有关binddata和onFieldChange的问题

分类:uni-app

产品分类: uniapp/H5

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 11

HBuilderX类型: 正式

HBuilderX版本号: 3.7.6

浏览器平台: Edge

浏览器版本: 105.0.1343.53 (正式版本) (64 位)

项目创建方式: HBuilderX

操作步骤:

见BUG 描述

预期结果:

见BUG 描述

实际结果:

见BUG 描述

bug描述:

  1. binddata如果不重写,对于表单组件无效,比如在switch或picker等组件中无效。
  2. onFieldChange在输入框中有效,但在switch或picker等组件中无效。
  3. 复现步骤见下方评论区。
2023-03-14 18:00 负责人:无 分享
已邀请:
DCloud_UNI_HT

DCloud_UNI_HT

提供一下代码片段,我看你怎么写的

  • 易者 (作者)

    放在下方的回复中,请移步,谢谢!

    2023-03-15 17:36

  • 易者 (作者)

    人呢?

    2023-03-18 13:54

DCloud_UNI_HT

DCloud_UNI_HT

  1. 给uni-forms label-width 属性
  2. picker 的问题没太看明白
  3. binddata或onFieldChange 只能在支持 v-model 的组件上生效 ,目前原则是 uni-forms 内部不修改页面用户的数据,所以需要 用户双向绑定 model 的值,使其发生变化后,组件做出对应的反应。 以上, switch 等组件不会生效,需要重写 binddata 方法使其 formData 发生变化,主动触发组件校验等功能
  • 易者 (作者)

    谢谢回复。




    1. 给uni-forms label-width 属性,这个我明白,我的意思是,如果uni-forms-item组件源代码中的label-width把注释中的80直接写入,那么在页面中使用uni-forms-item组件的时候,无须再使用label-width属性,除非有其它尺寸需求。这样能省很多事。




    2. picker举个例子,<picker>abc</picker>,如果不写入abc,那么picker就不显示值,但以前默认显示placeholder的属性值或者v-model的属性值。另外就是当前最新版只要用了picker组件,那么uni-forms-item的边框就消失,以前没这问题。




    3. 这一点解释明白了,也就是说,如果我要使用switch或picker之类的不支持 v-model的组件,就需要自定义binddata方法,但好像以前的版本不存在这个区别,都能通用binddata方法。



    2023-03-20 15:58

  • DCloud_UNI_HT

    回复 易者:



    1. 可以考虑增加

    2. picker 组件一直都没有 placeholder 和 v-model 来着,你是不是之前用了个其他的类picker的组件 ?边框问题我在看看

    3. 以前之所以没问题,是因为 uni-forms 的组件 model 是双向绑定的,所以binddata 生效,后来,因为组件内部会修改用户的值,造成用户有疑惑,所以取消了双向绑定的功能,所以现在需要用户自己修改 model 的值,组件内监听变化

    2023-03-20 16:08

  • 易者 (作者)

    回复 DCloud_UNI_HT: 其它解释我清楚了,picker组件的placeholder 和 v-model这两个属性值,是schema2code自动生成的,我在本贴中给出了示例,这两个属性值不是我手动添加的,如果picker 组件一直都没有 placeholder 和 v-model,那可能需要优化schema2code功能了。谢谢!

    2023-03-20 16:16

  • DCloud_UNI_HT

    回复 易者: 明白,我看下怎么回事

    2023-03-20 18:42

  • DCloud_UNI_HT

    回复 DCloud_UNI_HT: 看到schema你自己设置了 ,如果用户指定组件按指定的生成,如果不指定且满足条件时会自动生成 uni-data-picker

    2023-03-20 18:52

  • 易者 (作者)

    回复 DCloud_UNI_HT: 属性的使用与否倒是好说,但picker组件的显示值以及uni-forms-item的边框显示问题,不知道是什么情况。

    2023-03-21 14:33

易者

易者 (作者)

这是dbschema代码:

{  
    "bsonType": "object",  
    "required": [],  
    "permission": {  
        "read": true,  
        "create": true,  
        "update": true,  
        "delete": true  
    },  
    "properties": {  
        "_id": {  
            "description": "ID,系统自动生成"  
        },  
        "testswitch1": {  
            "bsonType": "bool",  
            "label": "测试默认",  
            "defaultValue": false  
        },  
        "testswitch2": {  
            "bsonType": "bool",  
            "label": "测试onFieldChange",  
            "defaultValue": false  
        },  
        "testpicker1": {  
            "bsonType": "string",  
            "label": "测试默认picker",  
            "description": "请选择开始时分",  
            "defaultValue": "11:00",  
            "componentForEdit": {  
                "name": "picker",  
                "props": {  
                    "mode": "time",  
                    "start": "00:00",  
                    "end": "23:59"  
                }  
            }  
        },  
        "testpicker2": {  
            "bsonType": "string",  
            "label": "测试picker1",  
            "description": "请选择开始时分",  
            "defaultValue": "12:22",  
            "componentForEdit": {  
                "name": "picker",  
                "props": {  
                    "mode": "time",  
                    "start": "00:00",  
                    "end": "23:59"  
                }  
            }  
        }  
    }  
}  

用schema2code生成后,略加改动的源代码如下:

<template>  
  <view class="uni-container">  
    <uni-forms ref="form" :model="formData" validateTrigger="bind">  
      <uni-forms-item name="testswitch1" label="测试默认">  
        <switch @change="binddata('testswitch1', $event.detail.value)" :checked="formData.testswitch1"></switch>{{formData.testswitch1?'已开启':'已关闭'}}  
      </uni-forms-item>  
      <uni-forms-item ref="mytest1" name="testswitch2" label="测试onFieldChange">  
        <switch @change="(e)=>$refs.mytest1.onFieldChange($event.detail.value)" :checked="formData.testswitch2"></switch>{{formData.testswitch2?'已开启':'已关闭'}}  
      </uni-forms-item>  
      <uni-forms-item name="testpicker1" label="测试默认picker">  
        <picker mode="time" start="00:00" end="23:59" placeholder="请选择开始时分" @change="binddata('testpicker1', $event.detail.value)" v-model="formData.testpicker1"></picker>  
      </uni-forms-item>  
      <uni-forms-item ref="mytest2" name="testpicker2" label="测试picker1">  
        <picker mode="time" start="00:00" end="23:59" placeholder="请选择开始时分" @change="(e)=>$refs.mytest2.onFieldChange($event.detail.value)" v-model="formData.testpicker2">testtext{{formData.testpicker2}}</picker>  
      </uni-forms-item>  
      <view class="uni-button-group">  
        <button type="primary" class="uni-button" style="width: 100px;" @click="submit">提交</button>  
        <navigator open-type="navigateBack" style="margin-left: 15px;">  
          <button class="uni-button" style="width: 100px;">返回</button>  
        </navigator>  
      </view>  
    </uni-forms>  
  </view>  
</template>

页面效果如下图:

组件本身有两个问题:第一:表格左侧的标题宽度被挤压到下一行,如果把源代码中的默认值80写入就正常,但没写入。第二:picker组件须在开始标签和结束标签之间写入值才能显示,而且无论是否显示值,表格边框都不显示,这个问题以前没有。

另外就是组件方法binddata和onFieldChange无效,在页面中点击组件多次,值都不变。

HX3.7.3和uni-admin2.3.5都是当前最新版。上述问题vue2和vue3都一样。

易者

易者 (作者)

有没有人遇到同样的问题?

  • 7***@qq.com

    遇到相同问题,input的v-model和input都监听不到value值,请问有解决办法吗

    2023-03-20 10:46

  • 易者 (作者)

    回复 7***@qq.com: 需要改组件以及组件方法的源代码,但如果自行更改源代码,等官方更新版本后,又可能产生冲突,所以最好还是让官方修复bug然后更新版本。

    2023-03-20 10:51

  • 7***@qq.com

    回复 易者: 什么时候才能更新呢,有办法降版本吗

    2023-03-20 10:55

  • 易者 (作者)

    回复 7***@qq.com: 什么时候更新要看官方了, 我也不知道。降版本最好是自己有保存历史版本,但降版本还是不如最新版,只能寄望于官方尽快解决问题。

    2023-03-20 11:07

  • 7***@qq.com

    回复 易者: 好的,感谢

    2023-03-20 11:13

人走板凳凉

人走板凳凉

表单中怎么添加几个界面不显示的绑定项,查询出来的对象给页面,然后提交修改提交给接口。

要回复问题请先登录注册