陈显江 發表於 2021-5-17 18:19:00

uni-app中动态设置头部颜色及字体

<h2>应用场景:</h2>
<p>需要根据后台设置不同项目的主题色,头部相应的出现颜色,查看我们的uni-app开发文档,发现我们可以用2种方法来实现。</p>
<h3>方法一:</h3>
<p>我们可以使用&nbsp;</p>
<h3 id="setnavigationbartitle">uni.setNavigationBarTitle(OBJECT)&nbsp;&nbsp; 动态设置当前页面的标题</h3>
<h3 id="setnavigationbarcolor">uni.setNavigationBarColor(OBJECT)&nbsp; &nbsp;动态设置颜色跟背景色</h3>
<p>以上2个具体用法查看官网&nbsp;https://uniapp.dcloud.io/api/ui/navigationbar?id=setnavigationbarcolor</p>
<p>&nbsp;</p>
<p>具体如下</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">onReady(){
    uni.setNavigationBarTitle({
         title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">新的标题</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    })
   uni.setNavigationBarColor({
   frontColor: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">#ffffff</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
   backgroundColor: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">#ff0000</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
   })
}</span></pre>
</div>
<p><span style="font-size: 18px"><strong><span style="color: rgba(255, 0, 0, 1)">注意</span></strong></span></p>
<p>设置完以上代码会发现,在加载的过程中,会先出现<span style="color: rgba(255, 0, 0, 1)">页面标题跟颜色的闪烁出现框架内的设置</span></p>
<p><span style="color: rgba(255, 0, 0, 1)">解决方法</span></p>
<p><span style="color: rgba(255, 0, 0, 1)">我们可以在页面加载过程中头部统一用系统默认的颜色,等到数据加载完,头部跟页面内容再一起显示,不会有一种一闪而过的颜色</span></p>
<p><span style="color: rgba(51, 51, 0, 1)">1、在pages.json 对需要的页面进行默认初始值设置,设置如下</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">      {
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">path</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">pages/index/index</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
                </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">navigationBarBackgroundColor</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">#F9FAFC</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 小程序加载过程中页面的默认颜色,防止跟加载过程中闪烁</span>
                <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">navigationBarTitleText</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置为空,防止加载过程中出现系统默认的uni-app标题文字显示,一闪而过</span>
            }</pre>
</div>
<p>2、在具体页面中,由于我们的主题样式是通过接口请求获取到的数据,我们可以通过,数据请求过程中,头部跟底部页面显示同一个颜色,显示loading,等页面加载完再一起显示,避免一闪而过的用户体验!!!</p>
<div class="cnblogs_code">
<pre>&lt;view class="match" v-if="showPage"&gt;// 加载过程中主页面内容隐藏,数据成功再一起显示出来,防止闪烁!!!<br><br>&lt;script&gt;<span style="color: rgba(0, 0, 0, 1)">
    export </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)"> {
      data() {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> {

            }
      },
      methods: {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 对标题内容进行设置</span>
<span style="color: rgba(0, 0, 0, 1)">            setTitle(){
                uni.setNavigationBarTitle({
                  title: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">设置的新的标题</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
                });
            },

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 对颜色和进场动画进行设置</span>
<span style="color: rgba(0, 0, 0, 1)">            setColor(){
                uni.setNavigationBarColor({
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 字体颜色 仅支持 #ffffff 和 #000000</span>
                  frontColor: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">#000000</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">   背景颜色值,有效值为十六进制颜色</span>
                  backgroundColor: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">#ff0000</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> animation 结构</span>
<span style="color: rgba(0, 0, 0, 1)">                  animation: {
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> duration: 动画时间</span>
                        duration: <span style="color: rgba(128, 0, 128, 1)">2000</span><span style="color: rgba(0, 0, 0, 1)">,
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> timingFunc:动画效果
                            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> linear    动画从头到尾的速度是相同的。
                            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> easeIn    动画以低速开始
                            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> easeOut    动画以低速结束。
                            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> easeInOut    动画以低速开始和结束</span>
                        timingFunc: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">easeIn</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
                  }
                });

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭加载条</span>
<span style="color: rgba(0, 0, 0, 1)">            uni.hideNavigationBarLoading()
            },
            getData(){
               </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">请求接口成功</span>
               <span style="color: rgba(0, 0, 255, 1)">this</span>.$http.post(apis.gameHomePageall, { competitionId: <span style="color: rgba(0, 0, 255, 1)">this</span>.id }).then((res) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
               </span><span style="color: rgba(0, 0, 255, 1)">if</span> (res.data.code === <span style="color: rgba(128, 0, 128, 1)">200</span><span style="color: rgba(0, 0, 0, 1)">) {
                  </span><span style="color: rgba(0, 0, 255, 1)">this</span>.list =<span style="color: rgba(0, 0, 0, 1)"> res.data.data                  
                  setTimeout(()</span>=&gt;<span style="color: rgba(0, 0, 0, 1)">{<br>                        this.setTitle() // 把接口请求到的值赋值<br>                        this.setColor()
                        },</span><span style="color: rgba(128, 0, 128, 1)">20</span><span style="color: rgba(0, 0, 0, 1)">)
                  }
                })
            }
          },
            onLoad(){
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 显示加载条</span>
<span style="color: rgba(0, 0, 0, 1)">                uni.showNavigationBarLoading()
            }
      }
    }
</span>&lt;/script&gt;

&lt;style&gt;

&lt;/style&gt;                              </pre>
</div>
<p>&nbsp;我们可以把方法放到mixin里面,再需要配置的页面使用</p>
<h3>方法二:</h3>
<p>使用page-meta页面属性配置节点,用于指定页面的一些属性、监听页面事件。可部分替代pages.json的功能。</p>
<p>具体用法:https://uniapp.dcloud.io/component/page-meta</p>
<div class="cnblogs_code">
<pre>&lt;template&gt;
    &lt;page-meta&gt;
      &lt;navigation-<span style="color: rgba(0, 0, 0, 1)">bar
            :background</span>-color=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">theme</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
            :title</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nbTitle</span><span style="color: rgba(128, 0, 0, 1)">"</span>
      /&gt;
    &lt;/page-meta&gt;
    &lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">match</span><span style="color: rgba(128, 0, 0, 1)">"</span> v-<span style="color: rgba(0, 0, 255, 1)">if</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">showPage</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
&lt;/view&gt;</pre>
</div>
<p>&nbsp;</p>
<p>初始值同样的避免闪烁,都是等页面加载完了,再出现</p>
<p>theme: '#F9FAFC', // 微信默认背景,主题色必须是6hex #0064A8<br>                        nbTitle:'',</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/qdlhj/p/14778017.html
頁: [1]
查看完整版本: uni-app中动态设置头部颜色及字体