小言_互联网的博客

uni-app进阶使用(vuex、组件、api)

315人阅读  评论(0)

        在上一篇文章介绍了uni-app的基本用法,本章介绍在uni-app中vuex、组件、api的用法。

一、如何使用vuex

1.1 初始化

        在项目根目录下创建store文件夹,在其内新建一个文件index.js,在index.js对vuex进行初始化。


  
  1. import Vuex from 'vuex'
  2. import Vue from 'vue'
  3. Vue. use( Vuex)
  4. export default new Vuex. store({
  5. //定义数据
  6. state,
  7. //改变数据
  8. mutations,
  9. //异步操作
  10. actions,
  11. //计算
  12. getters,
  13. //模块
  14. modules
  15. ​})

        以上步骤创建完毕后,在main.js文件中对vuex进行导入,同时定义全局$store。


  
  1. import store from './store/index.js'
  2. Vue. prototype. $store=store

 1.2  state定义数据

        在/store/index.js


  
  1. state:{
  2. gTitle:{
  3. text: "你好vuex",
  4. color: "#000",
  5. fontSize: "24px",
  6. background: "#f70"
  7. }
  8. },

         在页面中进行使用时$store.state.gTitle.text。引用时也可以使用简写形式,首先引入state的简写import {mapState} from 'vuex',其次在computed模块内把全局的vuex数据转换为组件只读的数据...mapState{["gTitle"]},最后可以直接使用gTitle进行引用。

1.3 mutations改变数据

        mutations是改变state数据的唯一途径,在index.js的mutations模块中设置改变state数据的方式setFontSize(state,data){state.gTitle.fontSize=data+"px"},在页面使用时this.$store.commit("setFontSize",e.detail.value),简写方式为引入import {mapMutations} from 'vuex',定义methods:{...mapMutations(["setFontSize"])} ,使用 this.setFontSize(100)。

1.4 actions异步操作

        在与后端交互中,异步操作都放在actions模块中进行。在index.js文件actions模块中


  
  1. state:{
  2. joks:[]
  3. },
  4. mutations:{
  5. setJoks( state,data){
  6. state. joks=data;
  7. }
  8. },
  9. actions:{
  10. getJok( context,data){
  11. uni. request({
  12. url: "http://520mg.com/mi/list.php",
  13. method: 'get',
  14. data:data,
  15. //axios get 请求参数用params,post用data
  16. //uni.request post和get传参都用data
  17. //根据content-type,如果是application/json,那么data是json,如果是urlencoded data是url编码形式
  18. success: (res) => {
  19. console. log(res);
  20. context. commit( 'setJoks',res. data. result);
  21. }
  22. })
  23. }
  24. },

         在使用页面中


  
  1. export default {
  2. data( ) {
  3. return {
  4. }
  5. },
  6. onLoad( ) {
  7. this. $store. dispatch( "getJok",{ page: 1})
  8. }
  9. }

1.5 getters 计算

        用于内部计算,根据state中的数据计算出新的数据(只读)。在index.js中定义getters:{"totalLen":function(state){return }},在使用页面中import {mapGetters} from "vuex"; computed:{...mapGetters(["totalLen"])} 使用时 this.totalLen。

1.6 modules模块

        与vue中的vuex的modules用法相同,相当于vuex中套vuex使用。核心依然是state、mutations、actions、getters、modules五个模块。

二、api使用

2.1 uni.getSystemInfoSync() 获取系统信息

        常用于获取屏幕宽高、系统、品牌、brand、可使用窗口顶部位置、安全区域等信息。


  
  1. <template>
  2. <view>
  3. <view>屏幕宽高 {{info.screenWidth}} , {{info.screenHeight}} </view>
  4. <view>系统 {{info.osName}} </view>
  5. <view>品牌 {{info.model}} </view>
  6. <view>brand {{info.brand}} </view>
  7. <view>可使用的窗口顶部位置 {{info.windowTop}} </view>
  8. <view>安全区域 {{JSON.stringify(info.safeArea)}} </view>
  9. <view>安全区域 {{JSON.stringify(info.safeAreaInsets)}} </view>
  10. </template>
  11. <script>
  12. export default {
  13. data( ) {
  14. return {
  15. info:{},
  16. }
  17. },
  18. onLoad( ) {
  19. //获取系统信息
  20. var info=uni. getSystemInfoSync();
  21. this. info=info;
  22. console. log( this. info);
  23. //存储api
  24. uni. setStorageSync( "info",info);
  25. }
  26. }

2.2 获取胶囊信息uni.getMenuButtonBoundingClientRect() 

        这个功能一般只用于微信小程序。


  
  1. <template>
  2. <view>
  3. <!-- #ifdef MP -->
  4. <view>胶囊微信小程序 </view>
  5. <view>导航栏高度 {{(menuButtonInfo.top-info.statusBarHeight)*2+menuButtonInfo.height}} </view>
  6. <view>胶囊 {{JSON.stringify(menuButtonInfo)}} </view>
  7. <!-- #endif -->
  8. </view>
  9. </template>
  10. <script>
  11. export default {
  12. data( ) {
  13. return {
  14. menuButtonInfo:{}
  15. }
  16. },
  17. onLoad( ) {
  18. //获取胶囊按钮的边界
  19. let menuButtonInfo=uni. getMenuButtonBoundingClientRect();
  20. this. menuButtonInfo=menuButtonInfo;
  21. console. log(menuButtonInfo);
  22. },

2.3 图片操作的api

        上传图片,使用uni.chooseImage()选择图片,其内部嵌套uni.uploadFile()。

        单击图片实现图片预览模式uni.previewImage(),在接口内部可以实现分享uni.share(),保存uni.saveImageToPhotosAlbum()等功能,使用时注意嵌套的层级关系。


  
  1. <template>
  2. <view>
  3. <view>图片操作 </view>
  4. <view>选择与预览图片 </view>
  5. <button @click="selectPic">选择 </button>
  6. <view v-for="item in list" :key="item" @click="preview(item)">
  7. <image :src="item"> </image>
  8. </view>
  9. </view>
  10. </template>
  11. <script>
  12. export default {
  13. data( ) {
  14. return {
  15. }
  16. },
  17. methods: {
  18. preview( item){
  19. var that= this;
  20. //单击图片实现预览
  21. uni. previewImage({
  22. //预览的图片列表
  23. urls: this. list,
  24. current:item, //当前图片
  25. longPressActions:{
  26. //定义长按按钮
  27. itemList:[ '发送给朋友', '保存图片', '收藏'],
  28. success: function( data){
  29. console. log( '选中了第'+(data. tapIndex+ 1)+ '个按钮,第'+(data. index+ 1)+ '张图片');
  30. //保存
  31. if(data. tapIndex== 1){
  32. //保存到本地相册
  33. uni. saveImageToPhotosAlbum({
  34. filePath:that. list[data. index],
  35. success( ) {
  36. uni. showToast({
  37. title: "保存成功"
  38. })
  39. }
  40. })
  41. }
  42. //分享
  43. if(data. tapIndex== 0){
  44. //分享给朋友 (app打包时候分享要去微信的开发平台注册)
  45. uni. share({
  46. provider: "weixin",
  47. scene: "WXSceneSession",
  48. type: 2,
  49. imageUrl:that. list[data. index],
  50. success: function( res){
  51. console. log( "success:"+ JSON. stringify(res));
  52. },
  53. fail: function( err){
  54. console. log( "fail:"+ JSON. stringify(err));
  55. }
  56. })
  57. }
  58. },
  59. fail: function( err){
  60. console. log(err. errMsg);
  61. }
  62. }
  63. })
  64. },
  65. selectPic( ){
  66. var that= this;
  67. //选择图片
  68. uni. chooseImage({
  69. count: 3, //默认选3张
  70. success( res){
  71. //遍历结果的
  72. for( let i= 0;i<res. tempFilePaths. length;i++){
  73. //上传图片
  74. uni. uploadFile({
  75. //上传地址
  76. url: 'http://520mg.com/ajax/file.php',
  77. //图片信息
  78. filePath:res. tempFilePaths[i],
  79. //name需要和后端约定,默认都会叫file
  80. name: 'file',
  81. success: result=>{
  82. //转换为json
  83. var data= JSON. parse(result. data);
  84. //添加域名后加入list
  85. that. list. push( "http://520mg.com"+data. pic);
  86. }
  87. })
  88. }
  89. }
  90. })
  91. }
  92. }
  93. }
  94. </script>

三、组件的使用

3.1 自定义组件

        自定义组件使用easycom方式,使用方式较vue简便了很多。组件定义完以后,可以不用import 导入,不用在components中注册,直接使用。

3.2 组件传参

        父组件向子组件传参,通过属性的方式进行传递<steper :value="d1"></steper>,子组件通过props来接收props:{ value:{ type:Number, default:1 ​} ​}。 

        子组件向父组件传参,子组件通过this.$emit("事件名",传递的参数) 触发事件,父组件监听事件并更新值。

3.3 uni-app官网组件

        官方网址:组件使用的入门教程 | uni-app官网 ;路径:首页->组件->扩展组件,里面有大量封装好的组件,比较常用的有倒计时组件uni-countdown、轮播图组件uni-swiper-dot、弹框组件uni-popup等。

        在项目根目录下新建uni_modules 文件夹,单独安装需要的某个组件。下表为uni-ui的扩展组件清单,点击每个组件在详情页面可以导入组件到项目下,导入后直接使用即可,无需import和注册。

 3.4 第三方组件

        uni-app有很多第三方插件,在官网点击插件市场,会有很多的资源选择,这里给大家推荐的的uview第三方插件。可通过使用HBuilderX导入插件和下载插件ZIP两种方式进行使用,具体安装和配置大家异步参考官网https://uviewui.com,很详细。

        如果对你有用,欢迎收藏~

 


转载:https://blog.csdn.net/zhangxiaobai___/article/details/128119364
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场