梁杰 發表於 2019-9-9 17:57:00

uni-app中nvue (weex) 注意事项

<h3 id="前言">前言</h3>
<p>uni-app 是 DCloud 出品的新一代跨端框架,可以说是目前跨端数最多的框架之一了,目前支持发布到:App(Android/iOS)、H5、小程序(微信小程序/支付宝小程序/百度小程序/字节跳动小程序),目前市面上类似的框架还有:Taro(京东出品)、Megalo(网易出品)。</p>
<p>uni-app 的 nvue 说白了就是 weex 的那一套东西,uni-app 集成了 weex 的 SDK,也就实现了 App 端的原生渲染能力。</p>
<p>weex 支持的东西,在 nvue 里大多都是支持的,所以这里就不详细讲述 weex 的相关组件和 api 调用,只讲述一些在实际开发过程中遇到的一些小问题。</p>
<h3 id="hello-world">Hello World</h3>
<p>开始创建第一个 nvue 页面。</p>
<p>目录结构:</p>
<p><img src="https://img2018.cnblogs.com/blog/1312841/201902/1312841-20190215170151470-343589713.png" alt=""></p>
<p>index.nvue 代码如下:</p>
<pre><code class="hljs django"><span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">template&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">div&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">text&gt;<span class="hljs-template-variable">{{text}}<span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">text&gt;
    <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">template&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">script&gt;<span class="javascript">
    <span class="hljs-keyword">export <span class="hljs-keyword">default {
      data() {
            <span class="hljs-keyword">return {
                <span class="hljs-attr">text: <span class="hljs-string">'Hello World'
            }
      }
    }
<span class="hljs-tag">&lt;/<span class="hljs-name">script&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>如此真机运行可能遇到如下错误:</p>
<p><img src="https://img2018.cnblogs.com/blog/1312841/201902/1312841-20190215170126168-734722797.png" alt=""></p>
<p>造成这个问题的原因是 uni-app 项目里必须有一个 vue 的页面,新建一个 vue 页面然后重新运行就不会有问题了。</p>
<p><img src="https://img2018.cnblogs.com/blog/1312841/201902/1312841-20190215171400022-1263094606.png" alt=""></p>
<h3 id="image-设置-border-radius">image 设置 border-radius</h3>
<p>在 nvue 里面不能给 image 设置 border-radius,想要将矩形图案变为圆形需要在 image 外面包一层 div,代码如下:</p>
<pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">style=<span class="hljs-string">"width: 400px;height: 400px;border-radius: 400px;overflow: hidden;"&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">image <span class="hljs-attr">style=<span class="hljs-string">"width: 400px;height: 400px;" <span class="hljs-attr">src=<span class="hljs-string">"https://img-cdn-qiniu.dcloud.net.cn/uniapp/images/uni@2x.png"&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">image&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="设置真实像素">设置真实像素</h3>
<p>在 weex 的规范里只有一个长度单位即:px,屏幕总宽度为 750px,设置长度后,weex 引擎会根据手机屏幕的宽度动态计算出实际长度,类似于 uni-app 的 upx。</p>
<p>但是在实际开发过程中可能不想要这样动态的长度单位,此时可以使用 weex 1.x版本里面一个长度单位:wx。这个单位就是实际像素单位,虽然 weex 文档没有提及,但目前任然是可用的,当然随着 weex 的更新,wx 也可能会不再支持。</p>
<h3 id="引入外部的-css">引入外部的 css</h3>
<p>在 App.vue 里写的公用的样式在 nvue 里是不生效,多个 nvue 想要使用公用的样式,需要引入外部的 css。</p>
<p>由于 weex 的限制,不能在 style 节点下使用&nbsp;<code>@import "xxx.css"</code>&nbsp;这样的方式引入外部 css,需要使用如下方式引入 css:</p>
<pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">style <span class="hljs-attr">src=<span class="hljs-string">"@/common/test.css"&gt;<span class="undefined"><span class="hljs-tag">&lt;/<span class="hljs-name">style&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">style&gt;<span class="css">
   <span class="hljs-selector-class">.test {
      <span class="hljs-attribute">color: <span class="hljs-number">#E96900;
   }
<span class="hljs-tag">&lt;/<span class="hljs-name">style&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>需要注意的是在&nbsp;<code>&lt;style src="@/common/test.css"&gt;&lt;/style&gt;</code>&nbsp;节点里写样式是不生效的。</p>
<h3 id="使用-ttf-字体文件">使用 ttf 字体文件</h3>
<p>在nvue或者weex中是不能直接在css中 通过&nbsp;<strong>@font-face</strong>&nbsp;这样的方式引入字体文件的,需要在js中使用 dom 模块引入字体文件,可参考&nbsp;weex文档:</p>
<pre><code class="hljs javascript"><span class="hljs-keyword">const domModule = weex.requireModule(<span class="hljs-string">'dom');
domModule.addRule(<span class="hljs-string">'fontFace', {
    <span class="hljs-string">'fontFamily': <span class="hljs-string">"iconfont2",
    <span class="hljs-string">'src': <span class="hljs-string">"url('http://at.alicdn.com/t/font_1469606063_76593.ttf')"
});</span></span></span></span></span></span></span></code></pre>
<h3 id="vue-打开-nvue-时传递参数">vue 打开 nvue 时传递参数</h3>
<p>由于 vue 打开 nvue 时不能在 url 后携带参数,只能使用 storage 的方式进行参数传递。</p>
<p>在 vue 页面打开 nvue</p>
<pre><code class="hljs less"><span class="hljs-selector-tag">uni<span class="hljs-selector-class">.setStorageSync(<span class="hljs-string">'test', <span class="hljs-string">'hello');
<span class="hljs-selector-tag">uni<span class="hljs-selector-class">.navigateTo({
    <span class="hljs-attribute">url:<span class="hljs-string">"/pages/nvue/nvue"
})</span></span></span></span></span></span></span></span></code></pre>
<p>在 nvue 页面获得参数,在 created 里调用 uni-app 的 api 时需要延时一段时间才能调用成功(最新版 uni-app 框架已经修复此问题,不用延时也可以调用成功)。</p>
<pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">script&gt;<span class="javascript">
    <span class="hljs-keyword">export <span class="hljs-keyword">default {
      created() {
            <span class="hljs-built_in">console.log(<span class="hljs-string">"nvue created!");
            setTimeout(<span class="hljs-function"><span class="hljs-params">() =&gt; {
                uni.getStorage({
                  <span class="hljs-attr">key:<span class="hljs-string">'test',
                  <span class="hljs-attr">success: <span class="hljs-function">(<span class="hljs-params">res) =&gt; {
                        <span class="hljs-built_in">console.log(<span class="hljs-string">"获得上个页面传递的数据" + res.data)
                  }
                })
            },<span class="hljs-number">200)
      }
    }
<span class="hljs-tag">&lt;/<span class="hljs-name">script&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="仿微信朋友圈效果">仿微信朋友圈效果</h3>
<p>在开发中,有个页面需要做到如微信朋友圈那样效果:整体列表为从上到下排列,每个列表为左右两列,左边为用户头像,右边消息内容。</p>
<p>在开发的时候,首先想到的是父元素使用&nbsp;<code>flex-direction: row;</code>&nbsp;让头像和内容,分别在左右展示。但是出了问题,内容区域的高度不能根据文字的长度而撑开;如果父元素使用上下排列,内容区域的高度就可以被文字所撑开。</p>
<p>出现问题的代码如下:</p>
<pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">template&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">style=<span class="hljs-string">""&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"items"&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"headImg"&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"rgtBox"&gt;
                <span class="hljs-tag">&lt;<span class="hljs-name">text&gt;上下排列时候可以撑开内容,上下排列时候可以撑开内容,上下排列时候可以撑开内容,上下排列时候可以撑开内容,上下排列时候可以撑开内容,上下排列时候可以撑开内容,上下排列时候可以撑开内容,上下排列时候可以撑开内容,上下排列时候可以撑开内容。<span class="hljs-tag">&lt;/<span class="hljs-name">text&gt;
            <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"items" <span class="hljs-attr">style=<span class="hljs-string">"flex-direction: row;"&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"headImg"&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"rgtBox" <span class="hljs-attr">style=<span class="hljs-string">"flex: 1;"&gt;
                <span class="hljs-tag">&lt;<span class="hljs-name">text&gt;左右排列时候不可以撑开内容,左右排列时候不可以撑开内容,左右排列时候不可以撑开内容,左右排列时候不可以撑开内容,左右排列时候不可以撑开内容,左右排列时候不可以撑开内容,左右排列时候不可以撑开内容,左右排列时候不可以撑开内容,左右排列时候不可以撑开内容<span class="hljs-tag">&lt;/<span class="hljs-name">text&gt;
            <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
    <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">template&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">script&gt;<span class="javascript">
    <span class="hljs-keyword">export <span class="hljs-keyword">default {
    }
<span class="hljs-tag">&lt;/<span class="hljs-name">script&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">style&gt;<span class="css">
    <span class="hljs-selector-class">.items {
      <span class="hljs-attribute">background-color: <span class="hljs-number">#fff;
      <span class="hljs-attribute">margin-bottom: <span class="hljs-number">50px;
    }
    <span class="hljs-selector-class">.headImg {
      <span class="hljs-attribute">width: <span class="hljs-number">100px;
      <span class="hljs-attribute">height: <span class="hljs-number">100px;
      <span class="hljs-attribute">background-color: <span class="hljs-number">#555;
    }
    <span class="hljs-selector-class">.rgtBox {
      <span class="hljs-attribute">background-color: <span class="hljs-number">#fff;
    }
<span class="hljs-tag">&lt;/<span class="hljs-name">style&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>出现这个问题应该是 weex 的 bug,左边元素设置高度后,右边若不设置高度,其最大高度为左边元素的高度。解决办法就是将头像和内容均上下排列,然后设置内容区域的 margin-left、margin-top 和 min-height 就能达到类似的效果。</p>
<p>代码如下:</p>
<pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">template&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">style=<span class="hljs-string">"flex-direction: column;"&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"item"&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"headImg"&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"rgtBox"&gt;
                <span class="hljs-tag">&lt;<span class="hljs-name">text&gt;一段短文本,一段短文本<span class="hljs-tag">&lt;/<span class="hljs-name">text&gt;
            <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"item"&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"headImg"&gt;<span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">div <span class="hljs-attr">class=<span class="hljs-string">"rgtBox"&gt;
                <span class="hljs-tag">&lt;<span class="hljs-name">text&gt;这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本,这里是一段长文本<span class="hljs-tag">&lt;/<span class="hljs-name">text&gt;
            <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
    <span class="hljs-tag">&lt;/<span class="hljs-name">div&gt;
<span class="hljs-tag">&lt;/<span class="hljs-name">template&gt;

<span class="hljs-tag">&lt;<span class="hljs-name">script&gt;<span class="javascript">
    <span class="hljs-keyword">export <span class="hljs-keyword">default {}
<span class="hljs-tag">&lt;/<span class="hljs-name">script&gt;
<span class="hljs-tag">&lt;<span class="hljs-name">style&gt;<span class="css">
    <span class="hljs-selector-class">.item {
      <span class="hljs-attribute">background-color: <span class="hljs-number">#fff;
      <span class="hljs-attribute">margin-bottom: <span class="hljs-number">50px;
    }
    <span class="hljs-selector-class">.headImg {
      <span class="hljs-attribute">width: <span class="hljs-number">100px;
      <span class="hljs-attribute">height: <span class="hljs-number">100px;
      <span class="hljs-attribute">background-color: <span class="hljs-number">#555;
    }
    <span class="hljs-selector-class">.rgtBox {
      <span class="hljs-attribute">width: <span class="hljs-number">600px;
      <span class="hljs-attribute">min-height: <span class="hljs-number">100px;
      <span class="hljs-attribute">margin-left: <span class="hljs-number">130px;
      <span class="hljs-attribute">margin-top: -<span class="hljs-number">100px;
      <span class="hljs-attribute">background-color: <span class="hljs-number">#fff;
    }
<span class="hljs-tag">&lt;/<span class="hljs-name">style&gt;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre><br><br>
来源:https://www.cnblogs.com/dfsxh/p/11493214.html
頁: [1]
查看完整版本: uni-app中nvue (weex) 注意事项