微信小程序基础知识--------this.data 失效的方法

文章讲述了在微信小程序开发中遇到的this.setData在异步请求后失效的问题,提供两种解决方案:一是保存this为that并在异步回调中使用that.setData;二是使用箭头函数保持this指向。同时,文章还展示了如何处理从服务器获取的数据并进行分组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1内容页THIS

1.1程序

 * 生命周期函数--监听页面加载

   */

  onLoad: function (options) {

    

    let menu = wx.getMenuButtonBoundingClientRect();

    console.log(menu);

    //this.data.menutop=menu.top  错误

    this.setData({

      menutop:menu.top

    });

    let p = this.data.play;

//从服务器获取数据,条件isgood>0

wx.request({

//3

 // url:url+'/db/list1.php',

 //4

   url:`${url}/db/list1.php`,

  data:{

   where:"isgood>0" 

  },

   success (res) {

      let resArr=res.data;

  //对数据分组

let swiper=[];

let food=[];

for(let i=0;i<resArr.length;i++){

  resArr[i].pic=url+resArr[i].pic;

  if(resArr[i].isgood==1){

    swiper.push(resArr[i])

  }else{

    food.push(resArr[i])

  }

}

 console.log(swiper)

// console.log(arr1)

// console.log(arr2)

this.setData({                                             //this放在wxrequest 异步执行中会报错

swiper,

food

})

}

})

},//onload结束

 第一种方法

1.2.增加that

//从服务器获取数据,条件isgood>0

let that=this;

wx.request({

1.3.改变request内部的  this为that 

that.setData({

swiper,

food

})

完整代码

  onLoad: function (options) {

    

    let menu = wx.getMenuButtonBoundingClientRect();

    console.log(menu);

    //this.data.menutop=menu.top  错误

    this.setData({

      menutop:menu.top

    });

    let p = this.data.play;

//从服务器获取数据,条件isgood>0

let that=this;

wx.request({

//3

 // url:url+'/db/list1.php',

 //4

   url:`${url}/db/list1.php`,

  data:{

   where:"isgood>0" 

  },

   success (res) {

      let resArr=res.data;

  //对数据分组

let swiper=[];

let food=[];

for(let i=0;i<resArr.length;i++){

  resArr[i].pic= url+ resArr[i].pic;

  if(resArr[i].isgood==1){

    swiper.push(resArr[i])

  }else{

    food.push(resArr[i])

  }

}

 console.log(resArr)

// console.log(arr1)

// console.log(arr2)

that.setData({

swiper,

food

})

}

})

},//onload结束

第二种方法

1.2.sucess表示异步请求request成功后的回调  使用箭头没有this指向

代码加上箭头

 1 success :(res) =>{

2  异步内部为this

完整代码

/**

   * 生命周期函数--监听页面加载

   */

  onLoad: function (options) {

    

    let menu = wx.getMenuButtonBoundingClientRect();

    console.log(menu);

    //this.data.menutop=menu.top  错误

    this.setData({

      menutop:menu.top

    });

    let p = this.data.play;

//从服务器获取数据,条件isgood>0

//let that=this;

wx.request({

//3

 // url:url+'/db/list1.php',

 //4

   url:`${url}/db/list1.php`,

  data:{

   where:"isgood>0" 

  },

   success :(res) =>{

      let resArr=res.data;

  //对数据分组

let swiper=[];

let food=[];

for(let i=0;i<resArr.length;i++){

  resArr[i].pic= url+ resArr[i].pic;

  if(resArr[i].isgood==1){

    swiper.push(resArr[i])

  }else{

    food.push(resArr[i])

  }

}

 console.log(resArr)

// console.log(arr1)

// console.log(arr2)

this.setData({

swiper,

food

})

}

})

},//onload结束

2.列表页对this

2.1 令resArr

     let resArr=res.data;

2.2增加图片前面的网址

      for(let i=0;i<resArr.length;i++){

       resArr[i].pic= url+ resArr[i].pic;

完整代码

 /**

   * 生命周期函数--监听页面加载

   */

  onLoad:function (options) {

    console.log(options);

    wx.request({

    //url:`${url}/db/list1.php?where=classid=2`,

    url:`${url}/db/list1.php?where=classid=${options.classid}`,

     success :(res)=> {

      let resArr=res.data;

      for(let i=0;i<resArr.length;i++){

       resArr[i].pic= url+ resArr[i].pic;

      }

   

    //数据绑定

      this.setData({

      food:resArr

      })

    }

  })


 

  },//onload结束标志

课堂笔记

一、数据库相关操作:请参考第七,八教程

二、发起网络请求

  wx.request({

    url: '', //服务器接口地址,可以传参

    success (res) {

      console.log(res.data)

    }

  })


 

三、this.setData失效

  小程序在异步请求之后直接this.setData({})  是不起作用的,因为this丢失

  请求之前先保存this或使用箭头函数


 

<think>我们正在讨论微信小程序的组件相关知识。根据引用内容,我们可以提供以下信息:引用[1]提供了微信小程序组件应用的详细研究,包括基础组件、表单组件、导航组件、媒体组件等,以及组件性能优化技巧。引用[2]提到了UniApp微信小程序地图使用指南,其中涉及地理位置授权和地图API的使用注意事项。引用[3]介绍了微信小程序使用npm包的方法,特别是使用有赞组件库(Vant)的示例。用户的需求是“微信小程序组件使用指南或常见问题”,因此我们将围绕组件的使用和常见问题展开。回答结构:1.微信小程序组件概述2.常用组件分类及使用示例3.组件常见问题及解决方法4.组件性能优化技巧5.第三方组件库的使用(如Vant)注意:在回答中,我们会引用提供的参考文献,并在适当位置标注引用标记。</think>### 微信小程序组件使用指南及常见问题 #### 一、组件基础使用 微信小程序提供了丰富的内置组件,主要分为以下四类: 1. **基础组件**:视图容器(`view`)、文本(`text`)、图片(`image`)等 2. **表单组件**:输入框(`input`)、按钮(`button`)、选择器(`picker`)等 3. **导航组件**:页面链接(`navigator`)、路由跳转组件 4. **媒体组件**:视频(`video`)、音频(`audio`)、相机(`camera`)等 **基本使用示例**: ```html <!-- 视图容器 --> <view class="container"> <!-- 图片组件 --> <image src="/images/logo.png" mode="aspectFit"></image> <!-- 表单组件 --> <input placeholder="请输入内容" bindinput="onInput"/> <!-- 按钮组件 --> <button type="primary" bindtap="onSubmit">提交</button> </view> ``` #### 二、组件使用常见问题及解决方案 1. **组件样式失效问题** **原因**:小程序组件有默认样式 **解决**:在`app.wxss`中重置默认样式: ```css /* 重置按钮样式 */ button { margin: 0; padding: 10px; border-radius: 4px; } ``` 2. **自定义组件通信问题** **父子通信**: ```html <!-- 父组件 --> <child-component prop-data="{{parentData}}"></child-component> <!-- 子组件(child.js) --> Component({ properties: { propData: Object } }) ``` **子父通信**: ```javascript // 子组件触发事件 this.triggerEvent('customevent', {data: value}) // 父组件监听 <child-component bind:customevent="onEvent"></child-component> ``` 3. **地图组件定位失败**[^2] **解决步骤**: - 检查`app.json`是否声明权限:`"permission": {"scope.userLocation": ...}` - 确保已通过`wx.getSetting`获取用户授权 - 真机测试(开发者工具可能无法模拟定位) 4. **第三方组件库使用**[^3] **安装流程**: ```bash # 1. 初始化npm npm init # 2. 安装Vant组件库 npm install @vant/weapp # 3. 构建npm(微信开发者工具:工具->构建npm) ``` **使用示例**: ```html <van-button type="primary">第三方按钮</van-button> ``` #### 三、性能优化技巧[^1] 1. **组件复用**:对高频使用组件进行封装 2. **数据通信**:使用`observers`监听局部数据变化 3. **懒加载**:长列表使用`<recycle-view>`组件 4. **按需注入**:在页面json中配置`"componentPlaceholder"` ```json { "usingComponents": { "heavy-component": "/components/heavy" }, "componentPlaceholder": { "heavy-component": "view" // 延迟加载占位 } } ``` #### 四、特殊组件注意事项 1. **原生组件层级问题** `map`/`video`等原生组件默认最高层级,可通过`cover-view`覆盖 2. **自定义组件插槽** 使用具名插槽实现灵活布局: ```html <!-- 组件定义 --> <view> <slot name="header"></slot> <slot></slot> </view> <!-- 组件使用 --> <my-component> <view slot="header">自定义头部</view> <view>默认内容</view> </my-component> ``` > **最佳实践**:复杂页面建议拆分为多个自定义组件,每个组件维护独立逻辑和样式[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值