JS控制弹窗增加确定和取消

本文介绍了一个使用JavaScript实现的删除用户确认对话框的功能。当点击删除按钮时会弹出一个警告框询问用户是否真的要删除指定用户及其所有相关记录,并提示删除操作不可逆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<script type="text/javascript">
function ConfirmDel()
{
   if(confirm("确定要删除此用户吗?删除该用户将一并删除掉该用户的所有仓储记录,且不可恢复!"))
     return true;
   else
     return false;
}
</script>
 
<input name="shanchu" type="button" onClick="return ConfirmDel()" value="删 除">
<think>根据问题描述,修改后弹窗只显示确定取消按钮,没有根据注册的配置显示表单。这通常是因为在自定义表单组件中,我们没有正确地将配置传递给组件,或者组件内部没有根据配置渲染表单。 解决方案: 1. 确保在`modal-manager.js`的`show`方法中,不仅设置了弹窗的显示状态,还正确设置了弹窗的标题、配置初始数据。 2. 在自定义表单组件(custom-form-modal)中,确保接收这些属性(title, config, formData)并正确渲染。 我们已经在`modal-manager.js`的`show`方法中设置了这些数据: ```javascript if (this.modalComponent) { this.modalComponent.setData({ show: true, title: config.title, // 设置标题 config: config.config, // 设置表单配置 formData: initialData // 设置初始数据 }); } ``` 3. 在自定义表单组件中,我们需要在`properties`中定义这些属性,并在wxml中根据配置动态渲染表单。 检查`custom-form-modal`组件的实现: - 在`index.js`中,我们定义了properties: show, title, config, formData。 - 在`index.wxml`中,我们使用`wx:for`循环`config`来渲染表单。 但是,我们注意到在`index.wxml`中,我们使用`wx:for`循环的是`config`,而`config`是一个数组,每个元素代表一个表单区域(section),每个区域包含多个表单项(items)。因此,渲染逻辑应该是正确的。 可能的问题:在`modal-manager.js`中,我们获取的配置可能不正确,或者在注册弹窗时配置结构有误。 回顾注册弹窗的配置(例如订单弹窗): ```javascript registerModal('dingdan', { title: '订单管理', config: [ { title: '订单信息', items: [ { field: 'number', title: '订单编号', type: 'input', required: true, placeholder: '输入订单编号' }, // ... 其他表单项 ] } ], // ... 其他属性 }); ``` 这个配置中的`config`属性是一个数组,我们将其传递给了自定义表单组件的`config`属性,因此组件应该能够正确渲染。 如果还是只显示确定取消按钮,那么可能是自定义表单组件的wxml没有正确循环配置。检查`custom-form-modal/index.wxml`: 我们使用了两层循环:第一层循环`config`(每个区域),第二层循环每个区域中的`items`(表单项)。每个表单项根据`type`渲染不同的输入组件。 因此,请检查`custom-form-modal`组件的渲染逻辑。 另外,还有一种可能是传递的`config`为空。我们可以在`modal-manager.js`的`show`方法中加入日志,打印出传递的配置初始数据。 修改`modal-manager.js`的`show`方法: ```javascript show(modalName, params = {}) { // ... 获取config console.log('弹窗配置:', config); // ... 初始化initialData console.log('初始数据:', initialData); if (this.modalComponent) { this.modalComponent.setData({ show: true, title: config.title, config: config.config, // 注意:这里应该是config.config,因为注册的配置对象有一个config属性(数组) formData: initialData }); } } ``` 注意:在注册弹窗时,我们使用的是`config`属性来存放表单配置数组。在`modal-manager`中,我们传递的是`config.config`。所以这里要确保正确。 但是,在注册弹窗的配置对象中,表单配置的键名为`config`,所以`config.config`就是我们定义的数组。 如果问题仍然存在,请检查自定义表单组件的wxml是否被正确渲染,可以在组件内加入一些调试文本。 例如,在`custom-form-modal/index.wxml`的开头加入: ```html <text>当前标题:{{title}}</text> <text>配置:{{config}}</text> ``` 这样可以看到传递过来的标题配置是否正常。 另外,我们注意到在`custom-form-modal`组件中,我们使用了vant-weapp的组件,确保已经正确安装引入了vant-weapp。 如果配置正常,那么可能是样式问题,表单被隐藏了?检查wxss是否有隐藏样式。 根据以上分析,我们进行如下修改: 1. 在`modal-manager.js`的`show`方法中增加日志,确保配置初始数据正确。 2. 在自定义表单组件的wxml中临时增加调试信息。 3. 确保自定义表单组件的样式没有隐藏内容。 如果发现配置没有传递过来,检查传递过程。如果配置传递过来了,但没渲染,检查循环逻辑。 由于我们无法直接运行,这里提供一种可能:在注册弹窗时,有些弹窗配置使用了`beforeShow`异步函数,而我们在`show`方法中没有等待这个异步函数。 修改`modal-manager.js`的`show`方法,支持异步配置: ```javascript show(modalName, params = {}) { return new Promise(async (resolve, reject) => { // 使用async const config = getModalConfig(modalName); // ... 错误处理 // 如果有beforeShow函数,执行它 let dynamicConfig = {}; if (typeof config.beforeShow === 'function') { try { dynamicConfig = await config.beforeShow(params); } catch (error) { reject(error); return; } } // 合并配置 const mergedConfig = { ...config, ...dynamicConfig, config: dynamicConfig.config || config.config // 动态配置可能覆盖原配置数组 }; // 初始化弹窗数据 const initialData = { ...mergedConfig.formData, // 注意:这里使用mergedConfig ...params.initialData }; // 设置全局弹窗实例 this.currentModal = { name: modalName, config: mergedConfig, // 使用mergedConfig // ... 其他属性 }; // 显示弹窗 if (this.modalComponent) { this.modalComponent.setData({ show: true, title: mergedConfig.title, config: mergedConfig.config, // 使用mergedConfig.config formData: initialData }); } }); } ``` 这样,我们处理了异步配置的情况,例如`dingdan_chanpin`弹窗会动态加载产品选项。 请按照以上步骤进行修改,应该可以解决问题。 如果问题仍然存在,请提供更多错误信息或日志。 §§相关问题§§: 1. 在微信小程序中,如何实现一个全局的弹窗管理组件? 2. 如何处理微信小程序中自定义组件的异步数据加载? 3. 在微信小程序中,如何实现父子组件之间的通信? 4. 如何优化微信小程序中复杂表单的渲染性能?</think>根据问题描述,弹窗没有正确显示注册的表单配置,只显示了默认的确定取消按钮。这通常是因为没有正确地将弹窗配置传递给自定义表单组件。以下是完整的解决方案: ### 问题原因分析 1. 弹窗配置没有正确传递给自定义表单组件 2. 自定义表单组件没有根据配置动态渲染表单字段 3. 表单数据初始化不正确 ### 解决方案 #### 1. 修改 `modal-manager.js` 的 `show` 方法 确保正确传递弹窗配置表单数据: ```javascript:webapp/components/modal-registry/modal-manager.js show(modalName, params = {}) { return new Promise(async (resolve, reject) => { const config = getModalConfig(modalName); // 执行 beforeShow 钩子获取动态配置 let dynamicConfig = {}; if (typeof config.beforeShow === 'function') { try { dynamicConfig = await config.beforeShow(params); } catch (error) { console.error(`弹窗前置处理错误: ${modalName}`, error); } } // 合并配置 const mergedConfig = { ...config, ...dynamicConfig, formData: { ...config.formData, ...dynamicConfig.formData, ...params.initialData } }; // 设置当前弹窗 this.currentModal = { name: modalName, config: mergedConfig, resolve, reject, formData: mergedConfig.formData, parentContext: params.parentContext }; // 更新弹窗组件 if (this.modalComponent) { this.modalComponent.setData({ show: true, title: mergedConfig.title, config: mergedConfig.config, // 传递表单配置 formData: mergedConfig.formData // 传递表单数据 }); } else { reject(new Error('弹窗组件未注册')); } }); } ``` #### 2. 修改自定义表单组件 更新 `custom-form-modal` 组件以支持动态配置: ```javascript:webapp/components/custom-form-modal/index.js Component({ properties: { show: { type: Boolean, value: false }, title: { type: String, value: '表单标题' }, config: { type: Array, value: [] }, // 表单配置 formData: { type: Object, value: {} } // 表单数据 }, data: { errors: {}, tempData: {} }, observers: { 'config, formData': function(config, formData) { // 初始化表单数据 const initData = {}; if (config && config.length > 0) { config.forEach(section => { section.items.forEach(item => { if (item.field && formData[item.field] === undefined) { initData[`formData.${item.field}`] = item.defaultValue || ''; } }); }); } if (Object.keys(initData).length > 0) { this.setData(initData); } } }, methods: { // ... 其他方法保持不变 ... } }); ``` #### 3. 更新表单渲染逻辑 确保表单根据配置动态渲染: ```html:webapp/components/custom-form-modal/index.wxml <van-popup show="{{ show }}" position="bottom" custom-class="custom-form-modal"> <view class="modal-header"> <view class="title">{{ title }}</view> <van-icon name="close" size="20px" bind:tap="closeModal" /> </view> <scroll-view scroll-y class="form-content"> <!-- 动态渲染表单区域 --> <block wx:for="{{ config }}" wx:key="index"> <view class="form-row"> <view class="row-title">{{ item.title }}</view> <view class="row-content"> <!-- 动态渲染表单项 --> <block wx:for="{{ item.items }}" wx:key="field"> <view class="form-item"> <!-- 错误提示 --> <view wx:if="{{ errors[subItem.field] }}" class="error-message"> {{ errors[subItem.field] }} </view> <!-- 输入框 --> <block wx:if="{{ subItem.type === 'input' }}"> <view class="item-label">{{ subItem.title }}</view> <van-field value="{{ formData[subItem.field] }}" placeholder="{{ subItem.placeholder || '请输入' }}" data-field="{{ subItem.field }}" bind:change="handleInput" type="{{ subItem.inputType || 'text' }}" border="{{ false }}" /> </block> <!-- 时间选择器 --> <block wx:elif="{{ subItem.type === 'time' }}"> <view class="item-label">{{ subItem.title }}</view> <view class="time-picker" bindtap="openTimePicker" data-field="{{ subItem.field }}"> {{ formData[subItem.field] || subItem.placeholder || '选择时间' }} </view> </block> <!-- 下拉选择器 --> <block wx:elif="{{ subItem.type === 'select' }}"> <view class="item-label">{{ subItem.title }}</view> <view class="select-picker" bindtap="openSelectPicker" data-field="{{ subItem.field }}"> {{ getSelectLabel(subItem.options, formData[subItem.field]) || subItem.placeholder || '请选择' }} </view> </block> <!-- 按钮 --> <block wx:elif="{{ subItem.type === 'button' }}"> <van-button type="primary" size="small" data-field="{{ subItem.field }}" bind:tap="handleButtonClick" > {{ subItem.text }} </van-button> </block> <!-- 自定义组件 --> <block wx:elif="{{ subItem.type === 'custom' }}"> <custom-component value="{{ formData[subItem.field] }}" config="{{ subItem.config }}" data-field="{{ subItem.field }}" bind:event="handleCustomEvent" /> </block> </view> </block> </view> </view> </block> </scroll-view> <view class="modal-footer"> <van-button type="default" size="large" bind:tap="closeModal">取消</van-button> <van-button type="primary" size="large" bind:tap="submitForm">提交</van-button> </view> </van-popup> ``` #### 4. 添加必要的样式 确保表单元素正确显示: ```css:webapp/components/custom-form-modal/index.wxss /* 新增样式 */ .form-row { margin-bottom: 20rpx; border-bottom: 1rpx solid #eee; padding-bottom: 20rpx; } .row-title { font-weight: bold; margin-bottom: 15rpx; color: #333; } .form-item { margin-bottom: 20rpx; } .item-label { margin-bottom: 10rpx; font-size: 28rpx; color: #666; } .time-picker, .select-picker { padding: 15rpx; border: 1rpx solid #ddd; border-radius: 8rpx; background-color: #f9f9f9; } ``` #### 5. 在页面中正确初始化弹窗 在 `tianjia.js` 页面中: ```javascript:webapp/pages/tianjia/tianjia.js onLoad: function() { if (!this.checkPermission()) return; // 获取全局弹窗管理器 this.modalManager = modalManager; // 获取弹窗组件实例并注册 this.globalModal = this.selectComponent('#global-modal'); if (this.globalModal) { modalManager.registerModalComponent(this.globalModal); } else { console.error('全局弹窗组件未找到'); } // 初始化页面 this.initPage(); }, // 弹窗提交事件 onModalSubmit: function(e) { const formData = e.detail; this.modalManager.handleSubmit(formData); }, // 弹窗关闭事件 onModalClose: function() { this.modalManager.close(true); // 用户取消 }, ``` ### 关键改进点 1. **动态配置处理**:确保弹窗配置正确传递给表单组件 2. **表单初始化**:根据配置动态初始化表单字段 3. **渲染优化**:根据配置类型渲染不同的表单元素 4. **错误处理**:增强表单验证错误显示 5. **样式适配**:确保各种表单元素正确显示 ### 验证方法 1. 点击"新建订单"按钮,应显示包含订单编号、下单日期等字段的表单 2. 点击"添加产品"按钮,应显示包含产品选择、数量等字段的表单 3. 点击"添加板材"按钮,应显示包含厚度、材质选择等字段的表单
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值