h***@163.com
h***@163.com
  • 发布:2021-01-09 08:44
  • 更新:2021-01-09 10:58
  • 阅读:760

【报Bug】uniapp编译vue语法糖代码的时候出现的代码不一致问题

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

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

HBuilderX类型: 正式

HBuilderX版本号: 3.0.5

手机系统: Android

手机系统版本号: Android 11

手机厂商: 华为

手机机型: 任意哦

页面类型: vue

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

页面

<template>  
    <view class="container">  
        <button type="default" @click="onClickShowPicker('tx')">变速器</button>  
        <button type="default" @click="onClickShowPicker('trade_type')">交易方式</button>  
        <CarSelectPicker v-model="form.tx" :options="pickerOptions.tx" :visible.sync="pickerVisible.tx"></CarSelectPicker>  
        <CarSelectPicker v-model="form.trade_type" :options="pickerOptions.trade_type" :visible.sync="pickerVisible.trade_type"></CarSelectPicker>  
    </view>  
</template>  

<script>  
import CarSelectPicker from '@/components/car/car-select-picker.vue';  
export default {  
    components: {  
        CarSelectPicker  
    },  
    data() {  
        return {  
            form: {  
                images: [],  
                certs: [],  
                license_at: '',  
                tx: '',  
                trade_type: '',  
            },  
            pickerOptions: {  
                tx: [  
                    {label: '手动挡', value: 0},  
                    {label: '自动挡', value: 1},  
                ],  
                trade_type: [  
                    {label: '上门交易', value: 0},  
                    {label: '到店交易', value: 1},  
                ]  
            },  
            pickerVisible: {  
                license_at: false,  
                tx: false,  
                trade_type: false,  
            },  
        };  
    },  
    methods: {  
        /**  
         * 显示选择框  
         * @param {Object} key  
         */  
        onClickShowPicker(key) {  
            let _ = this  
            _.pickerVisible[key] = true  
        },  

    }  
};  
</script>  

<style></style>  

组件

<template>  
    <view style="position: fixed;top: 0;left: 0;width: 750upx;height: 100%;z-index: 91;" v-if="visible">  
        <view style="position: absolute;top: 0;left: 0;width: 750upx;height: 100%;z-index: 92;background-color: #000000;opacity: 0.6;" @click="onClickCancel"></view>  
        <view style="position: absolute;bottom: 0;left: 0;width: 750upx;height: 582upx;z-index: 93;">  

            <!-- 按钮栏 -->  
            <view class="uni-column" style="border-bottom: 1px solid rgb(232 232 232);border-top: 1px solid rgb(232 232 232);background-color: #FFFFFF;">  
                <view class="uni-row" style="height: 80upx;margin: 0upx 40upx;align-items: center;justify-content: space-between;font-size: 28upx;">  
                    <view style="color: rgb(177 177 177);" @click="onClickCancel">取消</view>  
                    <view style="color: rgb(0, 122, 255);" @click="onClickConfirm">确认</view>  
                </view>  
            </view>  

            <!-- 选择区 -->  
            <picker-view @change="onClickChange" :value="[index]" style="height: 500upx;background-color: #f1f1f1;">  
                <picker-view-column style="text-align: center;">  
                    <view v-for="(v, i) in options" :key="i">{{ v.label }}</view>  
                </picker-view-column>  
            </picker-view>  

        </view>  
    </view>  
</template>  

<script>  
    export default {  
        model: {  
            prop: 'value',  
            event: 'change'  
        },  
        props: {  
            options: Array,  
            visible: {  
                type: Boolean,  
                default: false,  
            }  
        },  
        data() {  
            return {  
                index: 0,  
            }  
        },  
        methods: {  

            /**  
             * 选择  
             * @param {Object} e  
             */  
            onClickChange(e) {  
                let _ = this  
                _.index = e.detail.value[0]  
            },  

            /**  
             * 取消  
             */  
            onClickCancel() {  
                let _  = this  
                _.$emit("update:visible", false)  
            },  

            /**  
             * 确认  
             */  
            onClickConfirm() {  
                let _ = this  
                let i = _.index  

                if(_.options[i]) {  
                    _.$emit('change', _.options[i].value);  
                } else {  
                    _.$emit('change', _.options[0].value);  
                }  
                _.$emit("update:visible", false)  
            },  
        }  
    }  
</script>  

<style>  
</style>  

操作步骤:

上门代码就是

预期结果:

上门代码就是

实际结果:

上门代码就是

bug描述:

初始

  1. 很奇怪的一个问题,我有两个页面,A 和 B
  2. 调用的方式都是 v-model.sync 的关键字进行编写
  3. 测试的时候用的是H5,微信小程序打包也是出现

问题

  1. A页面正常唤起弹窗,隐藏弹窗
  2. B页面正常唤起弹窗,无法隐藏弹窗

而后

  1. 我在问题页面修改了一下写法,把语法糖去掉改为
# 组件写法  
<CarSelectPicker :value="form.tx" @change="onChange" :options="pickerOptions.tx" :visible="pickerVisible.tx" @update:visible="onVisible">
# 父组件中定义的方法  
{  
    onChange(v) {  
        this.form.tx = v  
    },  
    onVisible(v) {  
        this.pickerVisible.tx = false  
    }  
}

发现

  1. 子组件中 $emit('update:visible', false)$emit('change', v) 这两个方法都成功把、参数、方法执行、都传递到了父组件
  2. 并且父组件中执行了 onChangeonVisible 这两个方法,并且也能拿到参数
  3. 但是,问题就是在这,方法是执行了,也是父组件的方法,this.pickerVisible.tx = false 也验证更改为了 false
  4. 但是,弹窗并没有隐藏,也就是,父组件的参数无法传递过子组件 对子组件产生影响
  5. 并且,为什么我能肯定是编译问题
  6. 因为,我新建的页面都能正常,但是就那一个页面不正常,还是因为版本更新的原因呢?
  7. 目前我在最新版本上测试还是能发现这个问题
2021-01-09 08:44 负责人:无 分享
已邀请:
h***@163.com

h***@163.com (作者) - 一个普通的程序猿

后来我找了一下资料在看到社区中有回答修改为 input 然后发现确实没问题,但是 .sync 还不清楚什么原因2

model: {    
  prop: 'value',    
  event: 'input'    
},

该问题目前已经被锁定, 无法添加新回复