一名Android开发者的微信小程序填坑之路(1)
<h1 id="前言" style="margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; font-weight: 100; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">前言</h1><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">首先要声明的是,我是一名 <a href="http://lib.csdn.net/base/15" class="replace_word" title="Android知识库" target="_blank" style="text-decoration: none; box-sizing: border-box; color: rgb(223, 52, 52); font-weight: bold;">Android</a> 开发者,之前基本没有<a href="http://lib.csdn.net/base/22" class="replace_word" title="jQuery知识库" target="_blank" style="text-decoration: none; box-sizing: border-box; color: rgb(223, 52, 52); font-weight: bold;">前端开发</a>经验,甚至连 JS ,HTML 都是为了开发小程序现学的一些皮毛——所以文章中所提到的一些点也许在资深前端开发者看来只是小case,但是站在一个 Android 开发者的角度来看确实是大坑。</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">前面就不说太多东西了,文章的末尾再谈谈我对小程序的一些看法——这篇文章主要是谈谈在开发小程序的过程中遇到的一些坑。</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">PS:推荐一下我写的一个<a href="http://lib.csdn.net/base/5" class="replace_word" title="微信开发知识库" target="_blank" style="text-decoration: none; box-sizing: border-box; color: rgb(223, 52, 52); font-weight: bold;">微信</a>小程序版的Gank客户端:<strong style="box-sizing: border-box;"><a href="https://github.com/lypeer/wechat-weapp-gank" style="text-decoration: none; box-sizing: border-box; color: rgb(12, 137, 207);">wechat-weapp-gank</a></strong></p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><img src="https://raw.githubusercontent.com/lypeer/wechat-weapp-gank/master/gif/weapp.gif" alt="gif" title="" style="border: none; box-sizing: border-box; max-width: 602px; height: auto;"></p><h1 id="正文" style="margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; font-weight: 100; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><a name="t1" style="box-sizing: border-box; color: rgb(12, 137, 207);"></a>正文</h1><h2 id="1获取小程序开发工具并正确安装" style="margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; font-weight: 100; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><a name="t2" style="box-sizing: border-box; color: rgb(12, 137, 207);"></a>1,获取小程序开发工具并正确安装?</h2><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">最近在一些地方看到很多人在入小程序坑的第一步就出现了很多的问题,其实很早之前(22号)关于怎样搞定小程序的开发工具就已经有比较好的资料了,大家可以直接去看一下然后照着做,基本上就没啥问题:<a href="https://github.com/gavinkwoe/weapp-ide-crack/blob/master/README.md" style="text-decoration: none; box-sizing: border-box; color: rgb(12, 137, 207);">获取小程序开发工具并正确安装的教程</a></p><h2 id="2直接在微信开发工具上写代码" style="margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; font-weight: 100; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><a name="t3" style="box-sizing: border-box; color: rgb(12, 137, 207);"></a>2,直接在微信开发工具上写代码?</h2><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">目前来讲,我们只能在微信的开发工具上编译小程序的代码,但是这并不意味着我们必须要在那个开发工具上写小程序的代码——用过那个开发工具的人就会知道,那个开发工具并没有多好用,代码提示挺弱鸡的,而且没有自动保存是硬伤。</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">那么怎么办呢?我们完全可以在别的工具里面写代码然后在小程序的开发工具里面编译。我试过 <strong style="box-sizing: border-box;">sublime</strong> 和 <strong style="box-sizing: border-box;">webstorm</strong> , 都是可以在上面开发的,但是最后还是发现 ws 更好用。我就不讲 sublime 怎么用了,大家只需要直接在里面打开项目文件夹然后点右下角选择当前的语言就可以了。接下来着重讲一讲如何在 ws 里面编写小程序代码。</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">首先选择小程序的目录在 ws 里面打开,这是很简单的。但是这个时候打开里面的文件之后你会发现,除了 js 代码它能认出来之外,其他的代码他都并不能够认出来——主要是 <em style="box-sizing: border-box;">.wxml</em> 和 <em style="box-sizing: border-box;">.wxss</em> 文件。为什么呢?<strong style="box-sizing: border-box;">因为虽然 <em style="box-sizing: border-box;">.wxml</em> 和 <em style="box-sizing: border-box;">.html</em> 文件很像,<em style="box-sizing: border-box;">.wxss</em> 文件和 <em style="box-sizing: border-box;">.css</em> 文件很像,但是编译器并不知道!</strong>这样一来,我们就无法在这两种文件里面享受 ws 强大的代码提示功能了——我们能接受这种事么?果断不能!那么接下来我们应该怎么办呢?<strong style="box-sizing: border-box;">告诉编译器,<em style="box-sizing: border-box;">.wxml</em> 格式的其实是 <em style="box-sizing: border-box;">HTML</em> 文件,<em style="box-sizing: border-box;">.wxss</em> 格式的其实是 <em style="box-sizing: border-box;">CSS</em></strong> 文件。</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><img src="http://ac-cnyv47la.clouddn.com/05573da42613a3cb5228.png" alt="告诉编译器,*.wxml* 格式的其实是 *HTML* 文件" title="" style="border: none; box-sizing: border-box; max-width: 602px; height: auto;"></p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">上图把做这件事的流程讲的很详细了,<em style="box-sizing: border-box;">.wxss</em> 文件的转化同理。这样做了之后,编辑器就会知道他们的真实面目,然后就可以有棒棒的代码提示了(但是请注意,有写微信自己写的东西编辑器不仅没有代码提示反而会报错,不管他就好了)!接下来就可以直接 ws 一个桌面小程序开发工具一个桌面,在 ws 里面写了代码直接划过去点编译了。</p><h2 id="3跳转page的时候怎么传递数据" style="margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; font-weight: 100; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><a name="t4" style="box-sizing: border-box; color: rgb(12, 137, 207);"></a>3,跳转page的时候怎么传递数据?</h2><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">小程序给我们开放了很好的接口来进行页面之间的跳转:</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><img src="http://ac-cnyv47la.clouddn.com/0062bb8c0c0c9402c3c7.png" alt="界面之间跳转" title="" style="border: none; box-sizing: border-box; max-width: 602px; height: auto;"></p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">但是在这个地方微信官方对于这一个接口并没有太多的描述,只是简简单单的给了我们一行代码:<code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">wx.navigateTo({url: "test ? id = 1"});</code> ,其实这里这样写是有些难以理解的——<code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">test</code> 是个什么鬼 ? <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">id</code> 是个什么鬼?中间那个问号是个什么鬼?<strong style="box-sizing: border-box;">这都是些什么鬼?</strong></p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">反正我看到的时候是一头雾水的。不过还好,经过一些摸索,终于知道了他们是啥。首先,<strong style="box-sizing: border-box;">代码里的 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">test</code> 代表要跳转到的 page 的url 地址。</strong>比如:</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><img src="http://ac-cnyv47la.clouddn.com/63eedd2e1493d00acab9.png" alt="要跳转到这个页面" title="" style="border: none; box-sizing: border-box; max-width: 602px; height: auto;"></p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">那么代码就应该是:</p><pre class="prettyprint" name="code" style="white-space: nowrap; box-sizing: border-box; position: relative; overflow-y: hidden; overflow-x: auto; margin-bottom: 1.1em; font-family: 'Source Code Pro', monospace; padding: 5px 5px 5px 60px; line-height: 1.45; word-break: break-all; color: rgb(51, 51, 51); border: 1px solid rgba(128, 128, 128, 0.0745098); border-radius: 0px; background-color: rgba(128, 128, 128, 0.0470588);"><code class="language-java hljshas-numbering" style="display: block; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">wx.navigateTo({url: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/pages/specific/specific"</span>});</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li></ul></pre><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">聪明的人可能已经发现了,上面的代码没有了示例代码里面 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">? id = 1</code> 的部分,怎么回事,是我写错了么?并不是。这一部分其实是跳转 page 时用来传值的关键方法,并不必需,但很有用。</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><em style="box-sizing: border-box;">* <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">?</code> 是一个分隔符一样的东西,它的后面就是所有要传到目标 page 的值。而这些值是通过键值对来一一对应的,每个键值对之间用 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">&</code> 隔开。但是要注意的是,似乎这种方式传值只能传 String 过去,不是 String 类型的值传过去之后也会被转化为 String 。*</em>比如,我传了个 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">array</code> 和 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">json</code> 过去:</p><pre class="prettyprint" name="code" style="white-space: nowrap; box-sizing: border-box; position: relative; overflow-y: hidden; overflow-x: auto; margin-bottom: 1.1em; font-family: 'Source Code Pro', monospace; padding: 5px 5px 5px 60px; line-height: 1.45; word-break: break-all; color: rgb(51, 51, 51); border: 1px solid rgba(128, 128, 128, 0.0745098); border-radius: 0px; background-color: rgba(128, 128, 128, 0.0470588);"><code class="language-java hljshas-numbering" style="display: block; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">var arrayData = [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"firstData"</span> , <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"secondData"</span>];var jsonData = {first: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"firstData"</span> , second: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"secondData"</span>};
wx.navigateTo({url: <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/pages/specific/specific ? data: "</span> + arrayData + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"&json="</span> + jsonData});</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">2</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">2</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">3</li></ul></pre><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">结果目标page里接受到的是:</p><pre class="prettyprint" name="code" style="white-space: nowrap; box-sizing: border-box; position: relative; overflow-y: hidden; overflow-x: auto; margin-bottom: 1.1em; font-family: 'Source Code Pro', monospace; padding: 5px 5px 5px 60px; line-height: 1.45; word-break: break-all; color: rgb(51, 51, 51); border: 1px solid rgba(128, 128, 128, 0.0745098); border-radius: 0px; background-color: rgba(128, 128, 128, 0.0470588);"><code class="language-java hljshas-numbering" style="display: block; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//目标page的onLoad方法</span>
onLoad: function (options) {
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//结果是:firstData , secondData</span>
console.log(options.data);
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//结果是:f</span>
console.log(options.data[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]);
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//结果是:</span>
console.log(options.json);
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//结果是:undefined</span>
console.log(options.data.first);
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//很显然,被转化了</span>
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">2</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">3</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">4</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">5</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">6</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">7</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">8</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">9</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">10</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">11</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">12</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">13</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">2</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">3</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">4</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">5</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">6</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">7</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">8</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">9</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">10</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">11</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">12</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">13</li></ul></pre><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">上面其实也演示了如何在目标 page 里面接收传过来的数据,直接在 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">onLoad()</code> 里面的 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">options</code> 取就可以了。</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">另外,其实更多的时候我们的需求并不是直接传一个固定的参数到目标 page 里面去,而是根据用户的一些操作传递不同的值到目标 page 里面去,这个时候该怎么办呢?要知道,我们是没有办法获得组件的(这点太坑了,没有 <em style="box-sizing: border-box;">window</em> 和 <em style="box-sizing: border-box;">document</em>)。这个时候,我们可以通过 <em style="box-sizing: border-box;">dataset</em> 来通过绑定组件数据达到目的。什么?你不知道 <em style="box-sizing: border-box;">dataset</em> 是什么东西?</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><img src="http://ac-cnyv47la.clouddn.com/a36ba58b3f0ccb4b338f.png" alt="dataset" title="" style="border: none; box-sizing: border-box; max-width: 602px; height: auto;"></p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><strong style="box-sizing: border-box;">多读书,多看报,多看文档少睡觉。</strong></p><h2 id="4某些图片无法加载" style="margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; font-weight: 100; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><a name="t5" style="box-sizing: border-box; color: rgb(12, 137, 207);"></a>4,某些图片无法加载?</h2><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">这个坑真的是深坑,可能很久很久都不会遇到,但是一旦遇到真的很蛋疼。</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">我拿来练手的项目是 <a href="http://gank.io/" style="text-decoration: none; box-sizing: border-box; color: rgb(12, 137, 207);">Gank.io</a> 的客户端,而 Gank 网站上的图片都是寄放在新浪图床上的,默认的存储的 url 是<code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">http://ww{1 || 2 || 3 || 4}.xxxxx.xxxxx.jpg</code>,<strong style="box-sizing: border-box;">然后在小程序里死活都加载不出来这些图片!!!</strong></p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">我一开始不知道到底是小程序的 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);"><image></code> 标签的问题还是图片的问题,就找了很多地方的图片来做测试,包括 CSDN 上的,简书上的,github 图床上的,结果是这些图片都可以正常显示——甚至新浪微博上的,一些人的头像,都可以显示!后来我发现,<strong style="box-sizing: border-box;">只要 <em style="box-sizing: border-box;">URL</em> 是 ww+数字 开头的图片,都不能正常的显示!</strong>这也太坑了。。。后来我就在思考怎么解决这个问题——要么改变 标签,他自身肯定是有问题的,可能对某些来源的图片不太友好;要么改变图片,让它去适应这个 标签。这两方面要改其实都挺难的,但是显然第一种方式基本上是不可能的,就只能在第二种方式上去下功夫。</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">最后经过不断地尝试,我总结了很多规律,最后通过把图片的 URL 由 ww+数字变成 ws+数字 解决了这个问题,让图片得以显示在小程序上。比如:</p><pre class="prettyprint" name="code" style="white-space: nowrap; box-sizing: border-box; position: relative; overflow-y: hidden; overflow-x: auto; margin-bottom: 1.1em; font-family: 'Source Code Pro', monospace; padding: 5px 5px 5px 60px; line-height: 1.45; word-break: break-all; color: rgb(51, 51, 51); border: 1px solid rgba(128, 128, 128, 0.0745098); border-radius: 0px; background-color: rgba(128, 128, 128, 0.0470588);"><code class="language-java hljshas-numbering" style="display: block; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">本来的URL:
http:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//ww1.sinaimg.cn/large/610dc034jw1f87z2n2taej20u011h11h.jpg</span>
变换之后的URL:
http:<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//ws1.sinaimg.cn/large/610dc034jw1f87z2n2taej20u011h11h.jpg</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">2</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">3</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">2</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">3</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">4</li></ul></pre><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">不要问我为什么这样改了就可以显示了,因为我也不知道。。。太神奇了。。。</p><h2 id="5thissetdata-显示没这个方法" style="margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; font-weight: 100; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><a name="t6" style="box-sizing: border-box; color: rgb(12, 137, 207);"></a>5,this.setData() 显示没这个方法?</h2><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">首先想要说的是,作为一个 Android 开发者,我非常不适应小程序的数据与控件绑定的方式。在 Android 开发的时候,我们是可以直接获得控件然后对控件做数据绑定的工作的,而在小程序里,我并不能够直接获得控件的对象,所有的数据绑定与动态修改只能通过维护 Page 里面的 <em style="box-sizing: border-box;">data{}</em> 以及调用<em style="box-sizing: border-box;">setData()</em> 方法来进行,我不好评判这两种方式的优劣,只能说真的很不习惯。</p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">但是有些和我一样以前没怎么接触过前端开发的朋友在做这个的时候就有可能会踩坑了——<strong style="box-sizing: border-box;">setData() 是 Page 这个层级上的方法,并不是在任何地方调用 <em style="box-sizing: border-box;">this.setData() </em>方法都可以顺利的得到我们预期的结果的。</strong>比方说:</p><pre class="prettyprint" name="code" style="white-space: nowrap; box-sizing: border-box; position: relative; overflow-y: hidden; overflow-x: auto; margin-bottom: 1.1em; font-family: 'Source Code Pro', monospace; padding: 5px 5px 5px 60px; line-height: 1.45; word-break: break-all; color: rgb(51, 51, 51); border: 1px solid rgba(128, 128, 128, 0.0745098); border-radius: 0px; background-color: rgba(128, 128, 128, 0.0470588);"><code class="language-java hljshas-numbering" style="display: block; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Page({
onLoad: function (options) {
wx.request({
url: Constant.GET_URL,
success: function (res) {
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.setData({...});
}
});
},
});</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">2</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">3</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">4</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">5</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">6</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">7</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">8</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">9</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">2</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">3</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">4</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">5</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">6</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">7</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">8</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">9</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">10</li></ul></pre><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">我在 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">wx.request()</code> 的回调接口里面 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">success()</code> 里面写 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">this.setData({...})</code>,就不能完成预期操作,程序会报错说没有 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">setData()</code> 这个方法,因为这个时候 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">this</code> 获取到的已经并不是 Page 了,上下文已经发生了变化,那么当前层级没有 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">setData()</code> 方法就很正常了。那么怎么解决这个问题呢?像这样:</p><pre class="prettyprint" name="code" style="white-space: nowrap; box-sizing: border-box; position: relative; overflow-y: hidden; overflow-x: auto; margin-bottom: 1.1em; font-family: 'Source Code Pro', monospace; padding: 5px 5px 5px 60px; line-height: 1.45; word-break: break-all; color: rgb(51, 51, 51); border: 1px solid rgba(128, 128, 128, 0.0745098); border-radius: 0px; background-color: rgba(128, 128, 128, 0.0470588);"><code class="language-java hljshas-numbering" style="display: block; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: inherit; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Page({
onLoad: function (options) {
that = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>;
wx.request({
url: Constant.GET_URL,
success: function (res) {
that.setData({...})
}
});
},
});
var that;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">2</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">3</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">4</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">5</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">6</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">7</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">8</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">9</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">10</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">11</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">12</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">13</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; padding-top: 6px; padding-bottom: 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">1</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">2</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">3</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">4</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">5</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">6</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">7</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">8</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">9</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">10</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">11</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">12</li><li style="box-sizing: border-box; padding-right: 5px; padding-left: 5px;">13</li></ul></pre><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">和一开始的区别在于多了一个全局变量 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">that</code>,并且在 <em style="box-sizing: border-box;">onLoad()</em> 方法里面对它进行了赋值,使它等于 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">this</code>。这样的话,我们就可以在这个 Page 的任何地方调用 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);">that.setData()</code> 来动态的改变控件的属性了。</p><h1 id="结语" style="margin-top: 0.8em; margin-bottom: 0.8em; box-sizing: border-box; font-weight: 100; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><a name="t7" style="box-sizing: border-box; color: rgb(12, 137, 207);"></a>结语</h1><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">本来是还有一些问题要谈一谈的,但是写到这里篇幅已经挺长的了,就干脆把其他的放到下一篇里面算了。剩下的问题还有:</p><ul style="box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><li style="box-sizing: border-box;">后台接收数据需要表单?小程序并不能很方便的获得数据的表单,甚至 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);"><form></code>标签获得的数据也不是。</li><li style="box-sizing: border-box;">解析 HTML 块?没有document,没有window,解析它简直是一种折磨。</li><li style="box-sizing: border-box;"><code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);"><form/></code> 里面无法获取 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);"><picker/></code> 的取值?明明文档里有说在 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);"><form/></code> 里面是可以支持 <code style="box-sizing: border-box; font-family: 'Source Code Pro', monospace; padding: 2px 4px; font-size: 12.6px; color: rgb(63, 63, 63); white-space: nowrap; border-radius: 0px; background-color: rgba(128, 128, 128, 0.0745098);"><picker/></code> 的,结果你会发现死活无法获得他的值。</li><li style="box-sizing: border-box;">要实现多层列表?有的时候也许需要在一个列表项的每一项下面又有一个子列表,在小程序里怎么做?</li><li style="box-sizing: border-box;">如何方便愉快的实现类似 Java 里面的静态变量的效果?没有一个专门的类存放 static final 的值供其他地方使用感觉全身都不自在。</li></ul><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">接下来我想谈一下我对小程序的看法。</p><ul style="box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><li style="box-sizing: border-box;">第一点,不管小程序能不能在未来的时间里在移动端大放异彩,学习它,掌握它,都是没有任何坏处的。</li><li style="box-sizing: border-box;">第二点,就目前的版本而言,小程序的表现让我有些失望——实在是太过封闭。开发小程序就感觉像是在微信给我们划定的一个小圈子里兜兜转转,在圈里也许我们能得到很良好的开发体验,但是一步都出去不得。</li><li style="box-sizing: border-box;">第三点,在性能与便捷之间,最终往往会是便捷取胜。</li><li style="box-sizing: border-box;">第三点,能用 js 开发的,最终都会用 js 开发。</li></ul><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">多谢各位看官看到这,顺便去点个star吧:<strong style="box-sizing: border-box;"><a href="https://github.com/lypeer/wechat-weapp-gank" style="text-decoration: none; box-sizing: border-box; color: rgb(12, 137, 207);">wechat-weapp-gank</a></strong></p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;">原文地址:</p><p style="margin-bottom: 1.1em; box-sizing: border-box;"><font color="#555555" face="microsoft yahei"><span style="line-height: 35px;">http://blog.csdn.net/luoyanglizi/article/details/52681245</span></font></p><p style="margin-bottom: 1.1em; box-sizing: border-box; color: rgb(85, 85, 85); font-family: 'microsoft yahei'; line-height: 35px;"><br></p><p></p>
页:
[1]