采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
我看到很多同学都有这个错误,完全跟七月老师代码一样,却总是在点击的时候报错,求解答,谢谢各位
Cannot create property '0' on string '';at "pages/posts/post-detail/post-detail" page onCollectionTap function
TypeError: Cannot create property '0' on string ''
谢谢,非常感谢!!!
先分析下报错原因,报错是发生在onColletionTap function中,可以先打一下断点测试一下,崩溃在了wx.setStorageSync('posts_collected', postsCollected),说明是postsCollected有问题,我们与这个相关的地方,一个是在onLoad方法中,声明这个对象。先去缓存中找有没有postsCollected,打断点发现没有,那么再看下一个与postsCollected有关的地方,是if else判断语句中,忽略了postsCollected不存在的情况。(我代码报错就在这,所以先假设你问题与我相似)。然后我们回过头,看为什么会这么报错,我们在if上打个断点,会发现系统默认postsCollected为"",这也是报错的原因:Cannot create property '0' on string '',string指的不是别的,正是postsCollected。所以补充好else逻辑部分,应该就OK了。
大哥太厉害了,完美解决。看到这一大段字眼泪都下来了,太感动啦,谢谢!
非常感谢!
您看看我改的else逻辑对不对呢? if (postsCollected) { var postCollected = postsCollected[postId]; this.setData({ collected: postCollected }) } else { var postsCollected = {}; postsCollected[postId] = false; wx.setStorageSync('posts_collected', postCollected); }
你好,请不要把23行的获取缓存postsCollected设置为{}。
如果设置为{},默认postsCollected是存在,然而此时postsCollected并没有赋值。因为你在23行将var postsCollected = {};所以只会进入到if判断语句中, postsCollected[postId]拿不到数据,postCollected会是undefined,代码会崩溃在this.setData中。
23行代码var postsCollected = wx.getStorageSync('posts_collected'),目的是获取本地的缓存,如果设置为var postsCollected = {};岂不是等于放弃获取本地缓存了?
微信开发工具上面有个清缓存,先清除数据缓存再调试一下,会直观的发现问题。假设你没有清除之前的缓存,此时onload加载数据,会发现setData也没有执行到,可以在调试器中AppData中查看,没有collected这一项。只是Console没有警告而已(这个地方挺好奇的,如果有缓存,即便this.setData不执行也没警告)。而清除数据缓存后,如果23行是postsCollected = {},则会直接警告。
接下来我放下测试图片(这也是为什么在这回复的原因,因为回答可以上图片,直接回复没办法发测试图。)
var postsCollected = wx.getStorageSync('posts_collected')情况下收藏以后,onLoad执行if中this.setData结果:
假设先执行var postsCollected = wx.getStorageSync('posts_collected'存在了数据缓存以后,改为postsCollected = {}情况下,onLoad执行完this.setData结果:
即便存在缓存,收藏图片也没有反应过来,因为设置postsCollected = {},获取到的postCollected不存在,所以初始化是默认的不收藏。虽然this.setData没报错,但是AppData中没有collected,说明并没有成功。
而这一切,都发生在unLoad中,也就是页面加载才会调用的方法。
#错误原因:if else判断语句中,忽略了postsCollected不存在的情况
#解决方法:完善if else中的针对postsCollected的逻辑部分
在if else代码中插入一段:
if (postsCollected === undefined){
var postsCollected = {};
postsCollected[postId] = false;
wx.setStorageSync('posts_collected', postsCollected);
}
具体判断对象是否为空的语句有很多
网址如下,各位可以瞧一瞧,我大部分都看不懂O_o.....
http://www.jb51.net/article/44726.htm
#看到了好多朋友跟我一样的错误,本人大二新手,实在是对这些了解的不多,感谢群里面的各位大神还有帮我回答问题的大神。我觉得这课程真滴蛮有用的,对知识体系的讲解很到位,同时谢谢七月老师。
欢迎各位指点和补充QAQ
同学想问一下你这个是怎么插入ifelse段里的,我发现了好多问题
终于搞定,postsCollected空对象的判断处理逻辑
onCollect(event){
var postsCollected = this.data._postsCollected
//判断postsCollected的空对象去做的事情
if(postsCollected == ''){
const postsCollected = {}
postsCollected[this.data._pid] = !this.data.collected
this.setData({
collected:!this.data.collected
})
wx.setStorageSync('posts_collected', postsCollected)
}else{
const postsCollected = this.data._postsCollected
},
感谢大佬,你这个else逻辑补足很好用,把collect动作的反选情况考虑进去了
各位朋友注意一下,这个地方如果出错,请将23行的老师给的代码替换为24行的代码。原因就是楼上那个大佬说的,postsCollected在23行其实不存在于缓存,所以系统默认为string类型字符串而不是对象,这样你后面对一个字符组赋值数组肯定不对,所以在这一行就将他设置为空对象即可。再次感谢楼上大佬哈!
你好,请看下后续补充回答哈。不请自来,勿怪哈哈哈哈哈~
谢谢指点,我是新手,起初不太理解,只想着程序正常运行就好没有想太多,看了老哥回答以后真的汗颜,没想到老哥想得这么透彻,暂时还不能完全看懂,但会一直慢慢琢磨,在这种课程里面碰到这么多热心大神,幸甚!
不用客气的,大家互相学习,一起加油!
我也遇到了这个问题.云里雾里.看了2位精彩解答给个赞
原因是因为之前的缓存没有删除,遇到了0,1以外的情况,所以出现了undefined
登录后可查看更多问答,登录/注册
历时4年,学员20000+,缔造高口碑的精品课程
16.1k 32
3.9k 24
1.8k 22
3.8k 22
1.6k 16
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号