uniapp 全局组件,uniapp全局变量四种实现方式

  uniapp 全局组件,uniapp全局变量四种实现方式

  Uni中如何实现全局消息提示及其组件?以下文章介绍了Uniapp全局消息提示的实现方法及其组件,希望对你有所帮助!

  UNI-APP开发(仿饿)开发课程:进入学习

  最近有一个项目需求,我们可以在H5和小程序中实时全局刷新消息,并在全局范围内进行消息提示。提示组件也需要一个自定义样式。第一,刷新实时消息只有两种,一种是短轮询,一种是长轮询。

  所谓短轮询,实际上就是前端用定时器每隔一定时间向后端发起请求,后端需要对轮询请求进行优化。

  长轮询意味着向后端发送消息请求,挂起请求,等待来自后端的新消息,然后重新发起消息请求。其实就是一个websocket通信。鉴于项目上线时间和成本,最终选择短轮询,在App.vue中进行全局消息提示

  

实现

  

1.短轮询请求-App.vue中

   async created(){ const _ this=thisetinterval(async()={

  const res=await _this。$ajax({

  URL:`/API/通知/状态

  })

  if(res.data.code===200){

  常数值=res.data.data.hasNew

  _这个。$store.commit({type: changeNew ,value})

  }

  },6000)

  }

2.全局消息提示组件

  在消息请求之后,需要有一个全局自定义组件来显示消息,但是有一个问题,就是在Unipp中,

  虽然App.vue是uni-app的主要组件,但是所有页面都在App.vue下切换,app . vue是一个页面入口文件。但是App.vue本身不是页面,所以不能在这里写视图元素。这个文件的功能包括:调用应用生命周期函数,配置全局样式,配置全局存储globalData。即在App.vue中,只能写js和css,不能挂载视图元素。那么,js中可以这样使用组件吗?$消息?我想到了用vue中的vue.prototype.$message挂载全局组件的方法。

  

(1)定义一个GlobalMessage.vue组件

  自定义一个消息提示组件,text将是我们传入的提示消息参数。

  模板

  div class=消息容器

  全局消息提示{{text}}

  /div

  /模板

  脚本/脚本

  style lang=scss 范围。消息容器{

  位置:固定;

  top:10%;

  z指数:2000;

  左:10%;

  宽度:200px

  高度:200px

  背景色:红色;

  }

  /style

(2)新建GlobalMessage.js

  介绍自定义组件。vue.extend可以使用基本的vue构造函数来创建子类。参数是包含组件的对象。对象的示例如下:

  {

  模板:,

  data(){

  返回{

  属性

  }

  }

  }但是此时并没有创建组件实例,需要用new方法创建。这些参数包括创建的组件的Dom节点和组件的内部属性。然后使用document.body.appendChild将组件呈现到主体中。此时,我们已经可以调用这个方法来全局安装定制组件了。

  函数showMessage(文本,持续时间){

  const MessageDom=新的MessageConstructor({

  el:document.createElement(div ),data(){

  返回{text:text,

  }

  }

  })document . body . appendchild(MessageDom。$el)

  }接下来,我们需要在vue原型上挂载这个方法,以便可以这样使用。$message。我们在vue.prototype上挂载$message并导出这个方法。

  函数registryMessage(){

  vue . prototype . $ message=show message

  }

  导出默认注册表消息GlobalMessage.js全部代码

  从“vue”导入vue

  从导入GlobalMessage。/global message . vue ;

  const message constructor=vue . extend(global message)

  函数showMessage(文本,持续时间){

  const MessageDom=新的MessageConstructor({

  el:document.createElement(div ),data(){

  返回{text:text,

  }

  }

  })

  document . body . appendchild(MessageDom。$el)

  }

  函数registryMessage(){

  vue . prototype . $ message=show message

  }

  导出默认注册表消息

(3)main.js中

  介绍一下我们抛出的方法,用Vue.use进行全局注册,这样就可以用这个了。$快乐留言。

  从导入GlobalMessage。/global message . js ;

  //也可以在这里直接执行。

  toastRegistry()vue . use(global message);使用

  这个。$message(测试数据)

3.小程序中如何实现

  超导制造,刚好能用这个。$message,但遇到了另一个问题。小程序中没有文档。我们来看看uni-app的官方文档:

  Uni-app的js API由标准ECMAScript的js API和Uni扩展API组成。

  标准ECMAScript的js只是最基础的js。在此基础上,浏览器扩展了窗口、文档和导航器等对象。小程序还基于标准js扩展了wx.xx、my.xx、swan.xx等多种API。Node还扩展了fs等模块。

  Uni-app基于ECMAScript扩展了Uni对象,API命名兼容小程序。Uni-app js代码,h5在浏览器中运行。非h5端(包括小程序和app),Android平台运行v8引擎,iOS平台运行iOS自带的jscore引擎,两者都不运行浏览器和webview。非H5端,不支持window、document、navigator等浏览器的js API

  uni-app的Js API

  那么要求就无法完成。我们采用另一种方案,用vuex状态机控制全局状态,把自定义组件放在需要的页面中,用状态机控制消息的提示内容、显示和隐藏。注意:请自行安装和配置vuex。

  main.js中的全局注册组件

  从“@/components/common/global message . vue”导入GlobalMessage

  Vue.com组件( GlobalMessage ,global message)在需要的页面上放置全局消息组件,但是我们需要在每个页面上添加组件标签,这实在是一种让人无法忍受的方式。所以看了一些文档,我们在jy文章里发现了一个工具Vue-insert-loader。

  

4.vue-inset-loader的使用

  我们来看加载器的提示:在编译阶段在sfc模板的指定位置插入自定义内容,适用于webpack构建的vue应用,常用于小程序需要全局引入组件的场景。(因为小程序没有打开根标签,所以没有办法在根标签下追加全局标签,所以要使用组件,必须在当前页面引入组件标签),而这个插件正好可以帮助我们全局追加组件标签。

  嵌入式装载机

  

(1)安装

   npm安装vue-插入-加载程序-保存-开发

  

(2)vue.config.js注入loader

  没有vue.config.js。请创建一个新文件。

  模块:{

  规则:[

  {

  测试:/。vue$/,

  使用:{

  加载器:“vue-inset-loader”

  ////为Hbuilder工具创建的单应用程序项目

  //loader:path . resolve(_ _ dirname,。/node _ modules/vue-inset-loader’)

  }

  }

  ]

  },

  //支持自定义pages.json文件路径

  //选项:{

  //pagesPath:path . resolve(_ _ dirname,。/src/pages . JSON’)

  //}

(3)pages.json配置文件中添加insetLoader

   insetLoader: {

  配置:{

  消息:全局消息/全局消息,

  },

  //全局配置

  标签:[确认],

  rootEle:div

  },

  pages: [

  {

  path : pages/tabbar/index/index ,

  样式:{

  NavigationBarTitleText :测试页,

  //单独配置,用法与全局配置一致,优先级高于全局配置。

  标签:[确认, abc],

  rootEle:div

  }

  },

  ]配置描述config(默认值:{})定义标签名称和内容的键值对。标签(默认:[])需要全局引入。打包后,这个标签rootEle的根元素的标签类型(默认:“div”)将被引入到所有页面中。默认值是div,支持正则化。例如,匹配任何标签。* " label和rootEle可以配置成单独页面的样式,具有优先级。

  

总结

  虽然实现了全局消息提示,但是在小程序中,这种方法还是太麻烦了,需要在每页上追加全局组件标签。希望大家能有更好的方法,不吝赐教。

  推荐:《uniapp教程》以上是讲如何使用Uniapp实现全局消息提示及其组件的细节。更多请关注其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: