uni-app 页面传参总丢值?3 种方法稳如狗!

明明传了对象,接收端却是 undefined;刷新页面参数直接消失...试了这 3 种方法,再也没出过问题!

✅ 方法 1:URL 传参(简单值首选)

适合传字符串、数字这类简单数据,直接拼在跳转路径后面

javascript

运行

javascript 复制代码
// 跳转页传参
uni.navigateTo({
  url: `/pages/detail/detail?id=1&name=测试`
});

// 接收页取值(onLoad 生命周期里)
onLoad(options) {
  console.log(options.id); // 1
  console.log(options.name); // 测试
}

⚠️ 注意:传对象会自动转字符串,复杂数据别用这个!

✅ 方法 2:全局变量传参(复杂数据首选)

App.vue 里定义全局变量,适合传对象、数组

javascript

运行

scss 复制代码
// App.vue 定义
export default {
  globalData: {
    userInfo: {}
  }
}

// 跳转页存数据
getApp().globalData.userInfo = { id: 1, name: "测试" };
uni.navigateTo({ url: `/pages/detail/detail` });

// 接收页取数据
onLoad() {
  const user = getApp().globalData.userInfo;
  console.log(user); // 完整对象
}

✅ 方法 3:本地存储传参(跨页面持久化)

需要数据持久化(比如重启 APP 还在)就用这个,存到本地缓存里

javascript

运行

javascript 复制代码
// 跳转页存数据
uni.setStorageSync("orderData", { id: 1, price: 99 });
uni.switchTab({ url: `/pages/order/order` });

// 接收页取数据
onShow() {
  const order = uni.getStorageSync("orderData");
  console.log(order);
  // 用完可以删掉,避免占用缓存
  uni.removeStorageSync("orderData");
}

💡 避坑提醒:

  1. URL 传参别传复杂对象,会被截断!
  2. 全局变量页面卸载不会消失,记得及时清空!
  3. 本地存储存多了占空间,用完就删!

#uni-app 开发 #前端技巧 #页面传参


2. 标题:uni-app 实现下拉刷新 + 上拉加载,复制就能用!

做列表页必备的下拉刷新 + 上拉加载,其实超简单!不用装插件,原生 API 两步搞定,兼容所有端!

📝 步骤 1:页面配置开启功能

在对应页面的 pages.json 里加配置,允许下拉刷新和上拉加载

json

json 复制代码
{
  "path": "pages/list/list",
  "style": {
    "enablePullDownRefresh": true, // 开启下拉刷新
    "onReachBottomDistance": 50 // 距离底部50px触发上拉
  }
}

📝 步骤 2:写逻辑代码

在页面的 script 里写两个生命周期函数,处理刷新和加载逻辑

javascript

运行

kotlin 复制代码
export default {
  data() {
    return {
      list: [], // 列表数据
      page: 1, // 当前页码
      pageSize: 10, // 每页条数
      hasMore: true // 是否还有更多数据
    };
  },
  onLoad() {
    // 页面加载时获取第一页数据
    this.getListData();
  },
  // 下拉刷新触发
  onPullDownRefresh() {
    // 重置页码和状态
    this.page = 1;
    this.hasMore = true;
    // 重新请求数据
    this.getListData(() => {
      // 停止下拉刷新动画
      uni.stopPullDownRefresh();
    });
  },
  // 上拉加载触发
  onReachBottom() {
    // 没有更多数据就直接返回
    if (!this.hasMore) return;
    // 页码+1
    this.page++;
    this.getListData();
  },
  methods: {
    // 获取列表数据
    getListData(callback) {
      // 模拟请求接口,实际换成你的接口地址
      uni.request({
        url: "https://xxx.com/api/list",
        data: {
          page: this.page,
          pageSize: this.pageSize
        },
        success: (res) => {
          const data = res.data.data;
          if (this.page === 1) {
            // 第一页直接覆盖数据
            this.list = data;
          } else {
            // 非第一页追加数据
            this.list = [...this.list, ...data];
          }
          // 没有更多数据了
          if (data.length < this.pageSize) {
            this.hasMore = false;
          }
          // 执行回调(停止下拉刷新)
          callback && callback();
        }
      });
    }
  }
};

✨ 优化体验:加加载提示

javascript

运行

php 复制代码
// 请求数据时显示加载中
uni.showLoading({ title: "加载中..." });
// 请求成功后隐藏
uni.hideLoading();

// 没有更多数据时提示
if (!this.hasMore) {
  uni.showToast({
    title: "没有更多数据了",
    icon: "none"
  });
}

💡 核心要点:

  1. 下拉刷新要重置页码,重新请求第一页!
  2. 上拉加载要判断是否还有更多数据,避免重复请求!
  3. 记得停止下拉刷新动画,不然会一直转!

#uni-app 教程 #列表分页 #下拉刷新


3. 标题:uni-app 图片预览 + 长按保存,超实用!

做项目时用户总说图片不能保存?一行代码实现图片预览,长按还能保存到相册,安排!

🎯 实现代码

html

预览

xml 复制代码
<!-- template 里写图片列表 -->
<view class="img-list">
  <image 
    v-for="(item, index) in imgList" 
    :key="index"
    :src="item" 
    class="img-item"
    @click="previewImg(index)"
  ></image>
</view>

javascript

运行

javascript 复制代码
export default {
  data() {
    return {
      // 图片列表,换成你的图片地址
      imgList: [
        "https://xxx.com/img1.jpg",
        "https://xxx.com/img2.jpg",
        "https://xxx.com/img3.jpg"
      ]
    };
  },
  methods: {
    // 预览图片
    previewImg(current) {
      uni.previewImage({
        current: current, // 当前点击的图片索引
        urls: this.imgList, // 所有要预览的图片列表
        longPressActions: {
          // 长按显示的操作菜单
          itemList: ["保存图片", "分享图片"],
          success: (res) => {
            if (res.tapIndex === 0) {
              // 点击保存图片
              this.saveImg(this.imgList[current]);
            }
          }
        }
      });
    },
    // 保存图片到相册
    saveImg(imgUrl) {
      uni.saveImageToPhotosAlbum({
        filePath: imgUrl,
        success: () => {
          uni.showToast({
            title: "保存成功",
            icon: "success"
          });
        },
        fail: (err) => {
          // 用户拒绝授权时提示
          if (err.errMsg.includes("auth deny")) {
            uni.showToast({
              title: "请开启保存图片权限",
              icon: "none"
            });
          }
        }
      });
    }
  }
};

🎨 加个简单样式

css

css 复制代码
.img-list {
  display: flex;
  flex-wrap: wrap;
  gap: 10rpx;
  padding: 20rpx;
}
.img-item {
  width: 30%;
  height: 200rpx;
  border-radius: 8rpx;
}

💡 权限提醒:保存图片需要用户授权,第一次点击会弹出授权提示,记得引导用户允许!

相关推荐
快被玩坏了2 小时前
二次封装了个复杂的el-table表格
前端
用户93816912553602 小时前
在TypeScript中,可选属性(?)与null类型的区别
前端
eason_fan2 小时前
Resize 事件导致的二进制内存泄漏:隐式闭包的 “隐形陷阱”
前端·性能优化
一只叫煤球的猫2 小时前
我做了一个“慢慢来”的开源任务管理工具:蜗牛待办(React + Supabase + Tauri)
前端·react.js·程序员
LYFlied2 小时前
AI时代下的规范驱动开发:重塑前端工程实践
前端·人工智能·驱动开发·ai编程
汉得数字平台2 小时前
汉得H-AI飞码——前端编码助手V1.1.2正式发布:融业务知识,提开发效能
前端·人工智能·智能编码
前端小万2 小时前
Jenkins 打包崩了?罪魁是 package.json 里的 ^
前端·jenkins
编程小白gogogo2 小时前
苍穹外卖前端环境搭建
前端
光影少年3 小时前
web端安全问题有哪些?
前端·安全