在uni-app自定义组件中使用uni-forms组件的labelPosition属性在字节小程序中不起作用
在uni-app自定义组件中使用uni-forms组件的labelPosition属性在字节小程序中不起作用
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | Windows 11 专业版 23H2 | HBuilderX |
# bug描述:
在自定义组件中使用uni-forms组件的labelPosition属性在字节小程序中不起作用
## 示例代码:
```html
<template>
<view>
<uni-forms labelWidth="330px"
label-position="top">
<uni-forms-item label="label"
required>
<uni-easyinput v-model="test"
placeholder="请输入label"
type="textarea"
autoHeight
maxlength="250"></uni-easyinput>
</uni-forms-item>
</uni-forms>
</view>
</template>
<script>
export default {
name: "MyComponent",
props: {
label: String,
},
data(){
return {'test':''};
}
}
</script>
<style scoped
lang="scss">
</style>
随便一个页面中引入这个组件
<my-component></my-component>
可见label-position不起作用
根本原因: uni-form代码
provide() {
return {
uniForm: this
}
},
这里提供的uniForm在uni-form-item组件中无法获取
操作步骤:
如代码示例100%重现
预期结果:
provide提供的属性在子组件inject中可以获取
实际结果:
provide提供的属性在子组件inject: { form: { from: ‘uniForm’, default: null }, }中无法获取
更多关于在uni-app自定义组件中使用uni-forms组件的labelPosition属性在字节小程序中不起作用的实战教程也可以访问 https://www.itying.com/category-93-b0.html
hello , 我这里测试使用 label-position 在字节小程序中是生效的,你可以更新一下插件版本看一下
更多关于在uni-app自定义组件中使用uni-forms组件的labelPosition属性在字节小程序中不起作用的实战教程也可以访问 https://www.itying.com/category-93-b0.html
建一个自定义组件,把你这段代码放入组件中就不起作用了。
代码我已经放在下一个评论中了,麻烦核对下谢谢。
运行后的效果我也放在下面了,麻烦爬楼,谢谢。
页面代码
<template>
<view>
<view style="padding: 20px;">
<uni-forms :modelValue="formData" label-position="top">
<uni-forms-item label="姓名" name="name">
<input type="text" v-model="formData.name" placeholder="请输入姓名" />
</uni-forms-item>
<uni-forms-item label="年龄" name="age">
<input type="text" v-model="formData.age" placeholder="请输入年龄" />
</uni-forms-item>
</uni-forms>
<button @click=“submitForm”>Submit</button>
</view>
<my-component></my-component>
</view>
</template>
自定义组件: <template> <view> <view style="padding: 20px;"> <uni-forms :modelValue="formData" label-position="top"> <uni-forms-item label="姓名" name="name"> <input type="text" v-model="formData.name" placeholder="请输入姓名" /> </uni-forms-item> <uni-forms-item label="年龄" name="age"> <input type="text" v-model="formData.age" placeholder="请输入年龄" /> </uni-forms-item> </uni-forms> <button @click=“submitForm”>Submit</button> </view> </view> </template>
<script> export default { name:"my-component", data() { return { formData:{ name:'', age:'', hobby:'', }, } }, methods:{ submitForm:()=>{ console.log('submit'); }, } } </script> <style> </style>可见写在page中的代码是正常运行的,但是自定义组件中的label-position不起作用
附件中的图片可以看出相同的代码,微信开发者工具与抖音开发者工具的差异。
label 是文字的位置,你说的差异是什么呢?
回复 DCloud_UNI_yuhe: 抖音小程序位置不对得嘛,代码都是写的顶部,抖音小程序在左侧,而微信是正常的啊
回复 DCloud_UNI_yuhe: 在page组件是正常的,在自定义组件中不正常,根本原因是抖音小程序在自定义组件中引用uni-form组件时provide提供的属性在子组件inject中获取不到。
回复 DCloud_UNI_yuhe: 在自定义组件中引用很多uni官方的组件都会出问题,原因就是这些组件中使用了provide与inject而在抖音中provide与inject似乎不起作用。
回复 DCloud_UNI_yuhe: 怎么样了大佬
@DCloud_UNI_yuhe 麻烦看下这张图
这是一个已知的uni-app在字节小程序平台上的兼容性问题。在自定义组件中使用uni-forms时,provide/inject机制在字节小程序中无法正常工作,导致labelPosition等属性失效。
解决方案:
- 最简单的方法是避免在自定义组件内直接使用uni-forms,改为在页面级组件中使用
- 或者改用props显式传递配置参数到子组件
临时解决方法:
<template>
<view>
<uni-forms :label-position="labelPos" labelWidth="330px">
<!-- 表单内容 -->
</uni-forms>
</view>
</template>
<script>
export default {
props: {
labelPos: {
type: String,
default: 'top'
}
}
}
</script>