prop 和 attr 中的一些羞羞的事情

引言

前几天做一个迷你京东小项目的时候涉及到一个全选的小功能,一开始用的是 attr,但是效果完全不是自己想要的,当商品按钮点击过一次后,attr就无法对其状态进行更改,最后谷歌了一番发现需要用 prop 来代替。虽然效果问题解决了,但是自己还是想弄懂 propattr 的区别.

版本使用不同

遇到问题我一般先会去查相关的官方文档,可在 jq 的 api 中文文档中没有发现有价值的东西,只是发现适用的版本和概念有所轻微的不同。

attr : 设置或返回被选元素的属性值.版本:1.0

prop : 获取在匹配的元素集中的第一个元素的属性值。版本:1.6+

从概念中发现操作的对象和使用也好像基本相同,然后带着疑惑去进行了一番实验并去查阅了一些相关资料

示例代码

<table>
        <thead>
            <tr><input type="checkbox" class="checkAll">全选</tr>
        </thead>
        <tbody>
            <tr><input class="item" type="checkbox">单选</tr>
            <tr><input class="item" type="checkbox">单选</tr>
            <tr><input class="item" type="checkbox">单选</tr>
            <tr><input class="item" type="checkbox">单选</tr>
            <tr><input class="item" type="checkbox">单选</tr>
            <tr><input class="item" type="checkbox">单选</tr>
        </tbody>
    </table>
复制代码
$('.checkAll').click(function() {
  $('.item').attr('checked', this.checked);
});
复制代码

问题描述

当全选按钮选中时单选按钮全部选中,当全选按钮不选中时单选按钮全部不选中,只点全选按钮时,反复几次都没问题,但是要是点击了其中一个单选按钮,那这个单选按钮就不会在像其它单选按钮一样跟随全选按钮的状态的改变而改变。

attr 和 prop 的本质

attrattribute 的缩写,propproperty 的缩写,都有属性的意思,只不过 attr 是操作 html 文档节点属性,prop 是操作 js 对象属性. attr 在 js 中使用的是 setAttributegetAttributeprop 直接使用原生 js 的 element[value]element[value]=key

attr 和 prop 的区别

attr 设置的属性值只能是字符串类型,如果不是字符串类型,也会调用其 toString() 方法,将其转换成字符串类型。

prop 设置的属性值可以包括数组和对象在内的任意类型

有关布尔值的属性

1.6 之后, attr 返回的也是字符串类型, 选中或禁用直接返回 checked,selected,disabled。否则返回undefined解决我问题的关键就是下面一句话

jQuery 认为:attribute 的 checked、selected、disabled 就是表示该属性初始状态的值,property 的 checked、selected、disabled 才表示该属性实时状态的值(值为 true 或 false)。

当涉及到 boolean 值时,比如 checkbox 这样的,有 truefalse 这样的布尔值的元素属性,attributes 在页面加载的时候就被设置,并且一直保持初始值,而 properties 则存储着元素属性的当前值。

所以当我没有点击单选按钮的时候,它就是没被用户点击过的浏览器刚加载出来的初始状态,此时可以通过 attr 去设置并操控,当有用户点击的时候,当前按钮就不是初始状态,attr自然也就无法操控。

class LazyLoader { constructor(dataManager) { this.dataManager = dataManager; this.cache = new Map(); this.entityTypeMap = { bancai: 'bancais', dingdan: 'dingdans', mupi: 'mupis', chanpin: 'chanpins', kucun: 'kucuns', dingdan_bancai: 'dingdan_bancais', chanpin_zujian: 'chanpin_zujians', zujian: 'zujians', caizhi: 'caizhis', dingdan_chanpin: 'dingdan_chanpins', user: 'users', jinhuo: 'jinhuos' }; this.proxies = new WeakMap(); } createProxy(entity, entityType) { // 1. 优先检查缓存 if (this.proxies.has(entity)) { return this.proxies.get(entity); } const cacheKey = `${entityType}_${entity.id}`; if (this.cache.has(cacheKey)) { return this.cache.get(cacheKey); } // 2. 代理检测简化 const handler = { get: (target, prop, receiver) => { // 特殊属性处理 if (prop === 'id') return target.id; const value = Reflect.get(target, prop, receiver); // 基本类型直接返回 if (typeof value !== 'object' || value === null) { return value; } // 处理数组引用 if (Array.isArray(value)) { const refType = this.getReferenceType(prop); return refType ? this.loadReferences(value, refType) : value; } // 处理对象引用 const refType = this.getReferenceType(prop); if (refType) { //console.log(refType) return this.loadReference(value, refType); } // 检查是否已经代理过这个对象 if (this.proxies.has(value)) { return this.proxies.get(value); } // 创建嵌套对象的代理 return this.createProxy(value, this.getEntityTypeFromRef(prop)); return value; } }; const proxy = new Proxy(entity, handler); // 3. 创建后立即缓存 this.proxies.set(entity, proxy); this.cache.set(cacheKey, proxy); return proxy; } getEntityTypeFromRef(prop) { const baseProp = prop.replace(/\d/g, ''); return baseProp in this.entityTypeMap ? this.entityTypeMap[baseProp] : `${baseProp}s`; } getReferenceType(prop) { try { const baseProp = prop.replace(/\d/g, ''); if (this.entityTypeMap[baseProp]) return this.entityTypeMap[baseProp]; const pluralProp = `${baseProp}s`; if (this.dataManager._rawData[pluralProp]) return pluralProp; } catch (error) { console.log(prop) } return null; } loadReference(ref, refType) { if (!ref?.id) { return ref;} const cacheKey = `${refType}_${ref.id}`; // 4. 统一使用缓存机制 if (this.cache.has(cacheKey)) { return this.cache.get(cacheKey); } const entities = this.dataManager._rawData[refType] || []; const entity = entities.find(e => e.id === ref.id); if (!entity) { console.warn(`Entity not found: ${refType} with id ${ref.id}`); return ref; } // 5. 使用createProxy确保代理一致性 const prosty= this.createProxy(entity, refType); return prosty } loadReferences(refs, refType) { return refs.map(ref => this.loadReference(ref, refType)); } resolveReferences(entity) { for (const attr in entity) { const refType = this.getReferenceType(attr); if (!refType) continue; if (Array.isArray(entity[attr])) { entity[attr] = entity[attr].map(item => this.dataManager._rawData[refType]?.find(e => e.id === item.id) || item ); } else if (entity[attr]?.id) { entity[attr] = this.dataManager._rawData[refType]?.find(e => e.id === entity[attr].id) || entity[attr]; } } return entity; } clearCache() { this.cache.clear(); } } class MiniProgramDataManager { constructor(baseUrl = '') { this.baseUrl = baseUrl; this.debug = true; this.networkAvailable = false; this.isSyncing = false; this.lastSync = null; this.syncInterval = 5 * 60 * 1000; this.storageKey = 'miniProgramData'; this._rawData = this.createEmptyData(); this.lazyLoader = new LazyLoader(this); this.callbacks = { all: [], bancais: [], dingdans: [], mupis: [], chanpins: [], kucuns: [], chanpin_zujians: [], dingdan_bancais: [], zujians: [], caizhis: [], dingdan_chanpins: [], users: [], jinhuos: [] }; this.initNetwork(); this.loadDataFromStorage(); this.startAutoSync(); } createEmptyData() { return { bancais: [], dingdans: [], mupis: [], chanpins: [], kucuns: [], dingdan_bancais: [], chanpin_zujians: [], zujians: [], caizhis: [], dingdan_chanpins: [], users: [], jinhuos: [], _lastModified: null, _lastSync: null }; } get data() { const handler = { get: (target, prop) => { if (prop.startsWith('_')) return target[prop]; if (Array.isArray(target[prop])) { return target[prop].map(item => this.lazyLoader.createProxy(item, prop.replace(/s$/, '')) ); } return target[prop]; }, set: (target, prop, value) => { target[prop] = value; return true; } }; return new Proxy(this._rawData, handler); } async initialize() { try { await this.syncData(); return true; } catch (error) { if (this._rawData._lastSync) return true; throw error; } } startAutoSync() { this.autoSyncTimer = setInterval(() => { !this.isSyncing && this.syncData(); }, this.syncInterval); } stopAutoSync() { clearInterval(this.autoSyncTimer); } async initNetwork() { try { const { networkType } = await wx.getNetworkType(); this.networkAvailable = networkType !== 'none'; } catch { this.networkAvailable = false; } } async syncData() { if (this.isSyncing) return; this.isSyncing = true; try { const since = this._rawData._lastSync; await this.fetchAll(since); this.lazyLoader.clearCache(); this.saveDataToStorage(); this.triggerCallbacks('refresh', 'all', this.data); } catch (error) { console.error('Sync failed:', error); this.triggerCallbacks('sync_error', 'all', { error }); if (!this._rawData._lastSync) throw error; } finally { this.isSyncing = false; } } async fetchAll(since) { try { const params = since ? { since } : {}; const resolvedData = this.baseUrl ? await this.request('/app/all', 'GET', params) : this.createEmptyData(); Object.keys(this._rawData).forEach(key => { if (key.startsWith('_') || !resolvedData[key]) return; if (since) { resolvedData[key].forEach(newItem => { const index = this._rawData[key].findIndex(item => item.id === newItem.id); index >= 0 ? this._rawData[key][index] = newItem : this._rawData[key].push(newItem); }); } else { this._rawData[key] = resolvedData[key]; } }); this._rawData._lastSync = new Date().toISOString(); this.saveDataToStorage(); return true; } catch (error) { console.error('Fetch error:', error); this.triggerCallbacks('fetch_error', 'all', { error }); throw error; } } async request(url, method, data, retryCount = 3) { return new Promise((resolve, reject) => { const fullUrl = `${this.baseUrl}${url}`; const requestTask = () => { wx.request({ url: fullUrl, method, data, header: { 'Content-Type': 'application/json' }, success: (res) => { if (res.statusCode >= 200 && res.statusCode < 300) { resolve(res.data.data); } else { const err = new Error(res.data?.message || 'API error'); retryCount > 1 ? setTimeout(requestTask, 1000, retryCount - 1) : reject(err); } }, fail: (err) => { retryCount > 1 ? setTimeout(requestTask, 1000, retryCount - 1) : reject(new Error(`Network error: ${err.errMsg}`)); } }); }; requestTask(); }); } registerCallback(entity, callback) { this.callbacks[entity]?.push(callback) || this.callbacks.all.push(callback); } unregisterCallback(entity, callback) { const arr = this.callbacks[entity] || this.callbacks.all; const index = arr.indexOf(callback); if (index !== -1) arr.splice(index, 1); } triggerCallbacks(operation, entity, data) { this.callbacks.all.forEach(cb => cb(operation, entity, data)); this.callbacks[entity]?.forEach(cb => cb(operation, data)); } async crudOperation(operation, entity, data) { try { const result = await this.request(`/app/${operation}/${entity}`, 'POST', data); this.updateLocalData(operation, entity, result || data); this.triggerCallbacks(operation, entity, result || data); return result; } catch (error) { this.triggerCallbacks(`${operation}_error`, entity, { data, error }); throw error; } } updateLocalData(operation, entity, data) { const key = `${entity}s`; const collection = this._rawData[key] || []; switch (operation) { case 'add': collection.push(data); break; case 'update': const index = collection.findIndex(item => item.id === data.id); index >= 0 ? collection[index] = data : collection.push(data); break; case 'delete': const deleteIndex = collection.findIndex(item => item.id === data.id); if (deleteIndex >= 0) collection.splice(deleteIndex, 1); break; } this._rawData._lastModified = new Date().toISOString(); this.lazyLoader.clearCache(); this.saveDataToStorage(); } loadDataFromStorage() { try { const storedData = wx.getStorageSync(this.storageKey); if (storedData) this._rawData = storedData; } catch (error) { console.error('Storage load error:', error); } } saveDataToStorage() { try { wx.setStorageSync(this.storageKey, this._rawData); } catch (error) { console.error('Storage save error:', error); wx.showToast({ title: '数据保存失败', icon: 'none' }); } } async addEntity(entity, data) { return this.crudOperation('add', entity, data); } async updateEntity(entity, data) { return this.crudOperation('update', entity, data); } async deleteEntity(entity, id) { return this.crudOperation('delete', entity, { id }); } async transactionalOperation(endpoint, data) { try { await this.request(`/app/Transactional/${endpoint}`, 'POST', data); await this.syncData(); return true; } catch (error) { this.triggerCallbacks('transaction_error', endpoint, { data, error }); throw error; } } } module.exports = MiniProgramDataManager; [Deprecation] SharedArrayBuffer will require cross-origin isolation as of M92, around July 2021. See https://developer.chrome.com/blog/enabling-shared-array-buffer/ for more details. [system] WeChatLib: 3.8.10 (2025.7.4 16:39:26) [system] Subpackages: N/A [system] LazyCodeLoading: false Fri Jul 25 2025 17:30:14 GMT+0800 (中国标准时间) 配置中关闭合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书检查 工具未校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书。 requestTask @ MiniProgramDataManager.js? [sm]:297 (anonymous) @ MiniProgramDataManager.js? [sm]:320 _callee5$ @ MiniProgramDataManager.js? [sm]:293 s @ regeneratorRuntime.js?forceSync=true:1 (anonymous) @ regeneratorRuntime.js?forceSync=true:1 (anonymous) @ regeneratorRuntime.js?forceSync=true:1 asyncGeneratorStep @ asyncToGenerator.js?forceSync=true:1 c @ asyncToGenerator.js?forceSync=true:1 (anonymous) @ asyncToGenerator.js?forceSync=true:1 (anonymous) @ asyncToGenerator.js?forceSync=true:1 request @ MiniProgramDataManager.js? [sm]:322 _callee4$ @ MiniProgramDataManager.js? [sm]:262 s @ regeneratorRuntime.js?forceSync=true:1 (anonymous) @ regeneratorRuntime.js?forceSync=true:1 (anonymous) @ regeneratorRuntime.js?forceSync=true:1 asyncGeneratorStep @ asyncToGenerator.js?forceSync=true:1 c @ asyncToGenerator.js?forceSync=true:1 (anonymous) @ asyncToGenerator.js?forceSync=true:1 (anonymous) @ asyncToGenerator.js?forceSync=true:1 fetchAll @ MiniProgramDataManager.js? [sm]:290 _callee3$ @ MiniProgramDataManager.js? [sm]:245 s @ regeneratorRuntime.js?forceSync=true:1 (anonymous) @ regeneratorRuntime.js?forceSync=true:1 (anonymous) @ regeneratorRuntime.js?forceSync=true:1 asyncGeneratorStep @ asyncToGenerator.js?forceSync=true:1 c @ asyncToGenerator.js?forceSync=true:1 (anonymous) @ asyncToGenerator.js?forceSync=true:1 (anonymous) @ asyncToGenerator.js?forceSync=true:1 syncData @ MiniProgramDataManager.js? [sm]:256 _callee$ @ MiniProgramDataManager.js? [sm]:212 s @ regeneratorRuntime.js?forceSync=true:1 (anonymous) @ regeneratorRuntime.js?forceSync=true:1 (anonymous) @ regeneratorRuntime.js?forceSync=true:1 asyncGeneratorStep @ asyncToGenerator.js?forceSync=true:1 c @ asyncToGenerator.js?forceSync=true:1 (anonymous) @ asyncToGenerator.js?forceSync=true:1 (anonymous) @ asyncToGenerator.js?forceSync=true:1 initialize @ MiniProgramDataManager.js? [sm]:218 initDataManager @ app.js? [sm]:50 onLaunch @ app.js? [sm]:13 (anonymous) @ app.js? [sm]:5 Show 11 more frames MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancaisForMupi1 MiniProgramDataManager.js? [sm]:100 bancaisForMupi2 MiniProgramDataManager.js? [sm]:100 bancai RangeError: Maximum call stack size exceeded at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1)(env: Windows,mp,1.06.2504010; lib: 3.8.10) [Perf][pages/bancai/bancai] Page.onLoad took 169ms MiniProgramDataManager.js? [sm]:100 caizhi RangeError: Maximum call stack size exceeded at Object.get (MiniProgramDataManager.js? [sm]:68) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1) at n (VM5637 WASubContext.js:1)(env: Windows,mp,1.06.2504010; lib: 3.8.10) [Perf][pages/bancai/bancai] Page.onShow took 67ms [Violation] 'message' handler took 393ms TypeError: Converting circular structure to JSON --> starting at object with constructor 'Object' | property 'bancai' -> object with constructor 'Array' | index 0 -> object with constructor 'Object' --- property 'caizhi' closes the circle at JSON.stringify (<anonymous>) at e.exports.send (index.js:1) at Object.f [as send] (index.js:1) at Object.g [as publish] (index.js:1) at se.multicast (WAServiceMainContext.js?t=wechat&v=3.8.10:1) at se.publish (WAServiceMainContext.js?t=wechat&v=3.8.10:1) at WAServiceMainContext.js?t=wechat&v=3.8.10:1 at ready (WAServiceMainContext.js?t=wechat&v=3.8.10:1) at Object.e.publish (WAServiceMainContext.js?t=wechat&v=3.8.10:1) at dr (WAServiceMainContext.js?t=wechat&v=3.8.10:1)(env: Windows,mp,1.06.2504010; lib: 3.8.10) [system] Launch Time: 3865 ms
最新发布
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值