当前位置:   article > 正文

微信小程序页面交互综合练习 (重点:解决“setData of undefined”报错问题)

微信小程序页面交互综合练习 (重点:解决“setData of undefined”报错问题)

一、写一个注册表单,点击“注册”按钮将用户输入的数据带到服务器,并且能在控制台显示参数。

(1)首先,我需要在vscode里面创建一个简易的node.js服务器

  1. //第一步:引入http模块
  2. var http =require('http');
  3. //第二步:创建服务器
  4. http.createServer(function(request,response){
  5. //发送http头部
  6. response.writeHead(200,{'Content-Type':'text/plain'});
  7. //获取请求参数
  8. console.log(request.url);
  9. //发送响应数据
  10. response.end(`[
  11. { "name": "JavaScript高级程序设计", "author": "扎卡斯", "price": "¥78.20" },
  12. { "name": "HTML5移动Web开发", "author": "黑马程序员", "price": "¥39.50" },
  13. { "name": "MongoDB设计模式", "author": "科普兰", "price": "¥28.40" }
  14. ]`);
  15. }).listen(8888);//使用 listen 方法绑定 8888 端口
  16. // 终端打印如下信息
  17. console.log('Server running at http://127.0.0.1:8888/');

(2)然后,需要在微信小程序开发工具的index.wxml里写一个注册表单

  1. <navigation-bar title="注册" back="{{false}}" color="black" background="#FFF"></navigation-bar>
  2. <scroll-view class="scrollarea" scroll-y type="list">
  3. <view>用户名:</view>
  4. <input type="text" model:value="{{username}}"/>
  5. <view>密码:</view>
  6. <input type="text" model:value="{{password}}"/>
  7. <view>性别:</view>
  8. <radio-group style="display: flex;" bind:change="test1">
  9. <radio value="man"/>
  10. <radio value="woman"/>
  11. </radio-group>
  12. <view>爱好:</view>
  13. <checkbox-group style="display: flex;" bind:change="test2">
  14. <checkbox value="sing"/>唱歌
  15. <checkbox value="dance"/>跳舞
  16. <checkbox value="ball"/>打篮球
  17. </checkbox-group>
  18. <view>
  19. <button bind:tap="regist">注册</button>
  20. </view>
  21. </scroll-view>

页面如下:

(3)最后在index.js里面给绑定的函数写上执行代码:

  1. Page({
  2. data: { //初始数据
  3. username:"",
  4. password:""
  5. },
  6. test1:function(e){ //性别
  7. this.setData({
  8. sex:e.detail.value
  9. })
  10. },
  11. test2:function(e){ //爱好
  12. console.log((e.detail.value).join(","));
  13. this.setData({
  14. hobby:e.detail.value
  15. })
  16. },
  17. regist:function(){ //点击注册
  18. wx.request({
  19. url: 'http://127.0.0.1:8888',
  20. method:"GET",
  21. data:this.data
  22. })
  23. }
  24. })

(4)代码运行结果:

我在vscode中运行创建服务器代码

当我填好表单数据点击提交

vscode终端如图显示:

二、将服务器里的数据渲染在我的wxml页面。注意数据显示前需要有“加载中”提示和“加载完毕”提示

(1)和题一 一样先运行我的vscode创建服务器代码,运行此代码

  1. //第一步:引入http模块
  2. var http =require('http');
  3. //第二步:创建服务器
  4. http.createServer(function(request,response){
  5. //发送http头部
  6. response.writeHead(200,{'Content-Type':'text/plain'});
  7. //获取请求参数
  8. console.log(request.url);
  9. //发送响应数据
  10. response.end(`[
  11. { "name": "JavaScript高级程序设计", "author": "扎卡斯", "price": "¥78.20" },
  12. { "name": "HTML5移动Web开发", "author": "黑马程序员", "price": "¥39.50" },
  13. { "name": "MongoDB设计模式", "author": "科普兰", "price": "¥28.40" }
  14. ]`);
  15. }).listen(8888);//使用 listen 方法绑定 8888 端口
  16. // 终端打印如下信息
  17. console.log('Server running at http://127.0.0.1:8888/');

(2)在微信小程序开发工具index.wxml搭建好静态页面

  1. <navigation-bar title="书店商城" back="{{false}}" color="black" background="#FFF"></navigation-bar>
  2. <scroll-view class="scrollarea" scroll-y type="list">
  3. <view wx:for="{{result}}" class="styles">
  4. {{item.name}}
  5. {{item.author}}
  6. {{item.price}}
  7. </view>
  8. </scroll-view>

(3)最后在index.js里面给绑定的函数写上执行代码:

如果在普通函数里依旧使用this.setData一定会出现“setData of undefined”的报错,我们可以通过两种方法来解决: 
1.使用箭头函数 =>,箭头函数的this就是指向当前页面了
2.使用var that=this普通函数。定义一个变量that将当前页面对象保存下来,把所有的this改为that,就可以使用当前页面对象来操作
3.特别注意二者区别:在箭头函数中,this 的值是在函数定义时确定的,而不是在调用时确定的。而在普通函数中,this 的值是在函数被调用时确定的,所以得写在onLoad里面。 
  1. Page({
  2. data: {
  3. result: [],
  4. },
  5. onLoad: function () {//onLoad生命周期函数。监听页面加载,且一个页面只会在创建完成后触发一次。就相当于出生
  6. var that = this;
  7. wx.showLoading({
  8. title: '正在加载...',
  9. });
  10. wx.request({
  11. url: 'http://127.0.0.1:8888/',
  12. method: "GET",
  13. // 注意:解决setData is undefined报错问题,我们可以使用两种方法来解决。
  14. // 1.使用箭头函数 =>,箭头函数的this就是指向当前页面了
  15. // 2.使用var that=this普通函数。定义一个变量that将当前页面对象保存下来,把所有的this改为that,就可以使用当前页面对象来操作
  16. // *二者区别注意:在箭头函数中,this 的值是在函数定义时确定的,而不是在调用时确定的。而在普通函数中,this 的值是在函数被调用时确定的,所以得写在onLoad里面。
  17. // 一、箭头函数实现:
  18. // success:res=>{
  19. // wx.hideLoading();
  20. // wx.showToast({
  21. // title: '加载完毕',
  22. // icon: "success",
  23. // duration:2000
  24. // });
  25. // this.setData({
  26. // result:res.data,
  27. // })
  28. // }
  29. // 二、var that=this普通函数实现
  30. success: function (res) {
  31. wx.hideLoading();
  32. wx.showToast({
  33. title: '加载完毕',
  34. icon: "success",
  35. duration: 2000
  36. });
  37. that.setData({
  38. result: res.data
  39. })
  40. }
  41. })
  42. }
  43. })

(4)页面结果显示:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/422973
推荐阅读
相关标签
  

闽ICP备14008679号