欢迎光临散文网 会员登陆 & 注册

微信小程序:a=b===c,自己项目经验的Q&A,点赞数界面和数据库同步更新【诗书画唱】

2021-06-09 14:28 作者:诗书画唱  | 我要投稿

目录

例子1:实现电影组件

sentence

常常用上让内容等等沿主轴垂直水平居中的CSS样式



例子2:实现获取的点赞的数据是动态的,是实时更新,从数据库中拿的(实现数据库和界面的点赞同步更新)

models文件夹下的js文件一般是写ajax的封装的



例子3:实现期刊号组件epsoide



常常可以用display:flex ; flex-direction:column实现“竖向”的“列”的排列效果(其实我认为,很多布局的话,实在不行的时候,可以用上position定位,比如相对定位,绝对定位等等,也用上弹性盒子)

episode


例子4:例子1到例子3的代码

没有提到的代码要么就是自己可以生成的代码,要么就是以前的专栏中讲过的代码


index.json中的代码基本都是自己生成的,基本一样是

{

  "component": true,

  "usingComponents": {}

}

父组件就是在index.json中声明组件后在wxml文件中调用

 比如例子中的 pages/classic/index.json


{

  "usingComponents": {

    "cmp-like":"/components/like/index",

    "cmp-movie":"/components/classic/movie",

    "cmp-epsoide":"/components/epsoide"

  }

}


运行效果

例子5:注意事项(项目经验之遇到的问题和我是怎么解决问题的)

Q:解决TypeError: callback is not a function的报错

Q:没有触发同个组件文件夹下index.js中声明的onLike事件

Q:a=b==c怎么运算的

Q:点击点赞按钮时,数据库点赞数加2,取消点赞按钮时数据库点赞数减2是什么原因导致这种bug?

Q:status = status === 'like' ? 1 : 0;是不是写多余了,有没有别的写法?

A:目前我尝试了,status = status === 'like';和status == 'like' ? status =1 : status =0;和status = status === 'like' ? 1 : 0;的效果是一样的。暂时我认为是写多余了。status = status === 'like' ? 1 : 0;可以理解成status = (status === 'like' ? 1 : 0);

C语言中a=b==c这个式子相当于先算b==c,若二者相等,则将1赋值给a,否则将0赋值给a,那么我个人推理js中a=b===c这个式子相当于先算b===c,若二者相等,则将1赋值给a,否则将0赋值给a




例子1:实现电影组件


sentence是关于格言警句的

sentence

音译:升腾 死

注册组件

常常用上让内容等等沿主轴垂直水平居中的CSS样式






常常用rpx,display:flex的弹性布局相关的设置

例子2:实现获取的点赞的数据是动态的,是实时更新,从数据库中拿的(实现数据库和界面的点赞同步更新)

models文件夹下的js文件一般是写ajax的封装的

以上我们就实现了“八”中的功能

例子3:实现期刊号组件epsoide



常常可以用display:flex ; flex-direction:column实现“竖向”的“列”的排列效果(其实我认为,很多布局的话,实在不行的时候,可以用上position定位,比如相对定位,绝对定位等等,也用上弹性盒子)

episode

音译:爱 破诶 搜的

例子4:例子1到例子3的代码


// components/classic/movie/index.js

Component({

  /**

   * 组件的属性列表

   */

  properties: {

    content:String,

    img:String,

  },


  /**

   * 组件的初始数据

   */

  data: {

    icon: './images/movie@tag.png'

  },


  /**

   * 组件的方法列表

   */

  methods: {


  }

})

<!--components/classic/movie/index.wxml-->

<view class="container">

    <image src="{{img}}" class="img"/>

    <image src="{{icon}}" class="tag"/>

    <text class="content">{{content}}</text>

</view>

<!--components/classic/movie/index.wxml-->

<view class="container">

    <image src="{{img}}" class="img"/>

    <image src="{{icon}}" class="tag"/>

    <text class="content">{{content}}</text>

</view>




/* components/classic/movie/index.wxss */

.container {

  display: flex;

  flex-direction: column;

  align-items: center;

}

.tag{

  width: 46rpx;

  height: 142rpx;

  position: relative;

  right: 310rpx;

  bottom: 58rpx;

}

.img {

  width: 750rpx;

  height: 500rpx;

}

.content {

  font-size: 36rpx;

  max-width: 550rpx;

}

index.json中的代码基本都是自己生成的,基本一样是

{

  "component": true,

  "usingComponents": {}

}

<!--components/epsoide/index.wxml-->

<view class="container">

  <view class="index-container">

    <text class="plain">No.</text>

    <text class="index">08</text>

    <view class="line"></view>

  </view>

  <view class="date-container">

    <text class="month">六月</text>

    <text class="year">2021</text>

  </view>

</view>




/* components/epsoide/index.wxss */

.container {

  display: inline-flex;

  height: 60rpx;

  flex-direction: row;

}

.plain {

  font-size: 32rpx;

}

.index {

  font-size: 60rpx;

  line-height: 60rpx;

  font-weight: 800;

  margin-right: 14rpx;

}


.index-container {

  display: flex;

  flex-direction: row;

  align-items: baseline;

}

.date-container {

  display: flex;

  flex-direction: column;

  margin-top: 6rpx;

}


.month {

  font-size: 24rpx;

  line-height: 24rpx;

}


.year {

  font-size: 20rpx;

}


.line {

  height: 44rpx;

  border-left: 1px solid black;

  margin-right: 14rpx;

}

// components/like/index.js

Component({

  /**

   * 组件的属性列表

   */

  properties: {

    //如果不声明变量数据类型,那么数据的内容可能无法在别的文件中调用

    count: Number,

    like: Boolean,

    //自己写的代码 START

    // bookImage:String

    //自己写的代码 END

  },


  /**

   * 组件的初始数据

   */

  data: {

    yesSrc: '/components/like/images/like.png',

    noSrc: '/components/like/images/like@dis.png',

  },


  /**

   * 组件的方法列表

   */

  methods: {

    onLike(){

      let count = this.properties.count

      let like = this.properties.like

//自己写的代码 START

// let bookImage= this.properties.image

//自己写的代码 END

      count = like ? count - 1 : count + 1

      //更新组件的状态

      this.setData({

        count,

        like: !like,

        //自己写的代码 START

        // bookImage:bookImage

        //自己写的代码 END

      })


//关于数据库和页面的点赞数同步更新的部分 START

 //触发绑定在like组件上的自定义事件

      //1、需要触发的自定义事件的名字

      //2、自定义事件需要传递的数据对象

      //3、配置事件的属性

      this.triggerEvent('myLike',{

        state: this.properties.like ? 'like' : 'cancel',

        nums: this.properties.count

      },{})


//关于数据库和页面的点赞数同步更新的部分 END


    }

  }

})


<!--components/like/index.wxml-->

<view class="container" bind:tap="onLike">

    <image src="{{like == '1' ? yesSrc : noSrc}}" />

    <text>{{count}}</text>

    

    

</view>

<!-- <image src="{{bookImage}}" />

<text>{{yesSrc}}1</text>

<text>{{bookImage}}1</text> -->


/*  自己写的代码 START*/


.container{

float:right;


}


/*  自己写的代码 END*/

// pages/classic/index.js

import ClassicModel from '../../models/classic.js'

  //关于数据库和页面的点赞数同步更新的部分 START

import config from '../../config.js'

  //关于数据库和页面的点赞数同步更新的部分 END

const classicModel = new ClassicModel()

Page({


  /**

   * 页面的初始数据

   */

  data: {

    classicData: null

    

  },


  /**

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

   */

  onLoad: function (options) {

    classicModel.getLatest(data => {

      console.log("pages/classic/index.js中打印的数据:",data)

      //关于数据库和页面的点赞数同步更新的部分 START

      // console.log(data)

      //修改image属性的内容:

      data.image = config.img_url + data.image

      //关于数据库和页面的点赞数同步更新的部分 END

      //更新数据

      this.setData({

        classicData: data

      })

    })

  },


//关于数据库和页面的点赞数同步更新的部分 START

  onLike(e){

    //更新点赞的状态

    classicModel.like({

      status: e.detail.state,

      index: this.data.classicData.index,

      nums: e.detail.nums

    })

  },

//关于数据库和页面的点赞数同步更新的部分 END


  /**

   * 生命周期函数--监听页面初次渲染完成

   */

  onReady: function () {


  },


  /**

   * 生命周期函数--监听页面显示

   */

  onShow: function () {


  },


  /**

   * 生命周期函数--监听页面隐藏

   */

  onHide: function () {


  },


  /**

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

   */

  onUnload: function () {


  },


  /**

   * 页面相关事件处理函数--监听用户下拉动作

   */

  onPullDownRefresh: function () {


  },


  /**

   * 页面上拉触底事件的处理函数

   */

  onReachBottom: function () {


  },


  /**

   * 用户点击右上角分享

   */

  onShareAppMessage: function () {


  }

})


{

  "usingComponents": {

    "cmp-like":"/components/like/index",

    "cmp-movie":"/components/classic/movie",

    "cmp-epsoide":"/components/epsoide"

  }

}

<!--pages/classic/index.wxml-->

<cmp-epsoide></cmp-epsoide>

<!-- 下面的话就是调用了点赞的组件 -->

<!-- <div> -->

<cmp-like count="{{classicData.fav_nums}}" 

    like="{{classicData.like_status}}" ></cmp-like>

    <!-- bookImage="{{classicData.image}}" -->

    <!-- <text>{{classicData.image}}</text> -->

    <!-- <image src="{{classicData.image}}"/>

</div> -->


<cmp-movie content="{{classicData.content}}" 

    img="{{classicData.image}}"></cmp-movie>


//utils/http.js

export default class Http {

  ajax({url,data = {},method = 'get',callback}){

    wx.request({

      url,

      data,

      method,

      success: res => {

        //获取请求的状态码:200,404,500

        let code = res.statusCode.toString()

        //判断code是否是以2开头的,如果以2开头的才可以调用回调函数

        if(code.startsWith('2')) {

          callback(res.data)

        } else {

          //弹出一个警告框

          this._showErr(code)

        }       

      },

      fail: err => {

        this._showErr(err.errMsg)

      }

    })

  }

  //私有的方法

  _showErr(msg){

    wx.showToast({

      title: `错误代码:${msg}`,

      icon: 'none',

      duration: 2000

    })

  }

}

//config.js

//用来存放常量的文件

export default {

  base_url: 'http://127.0.0.1:9001/',

  img_url: 'http://127.0.0.1:9001/public/images/'

}


运行效果


例子5:注意事项(项目经验之遇到的问题和我是怎么解决问题的)


Q:解决TypeError: callback is not a function的报错


A://解决TypeError: callback is not a function的报错 START

          callback && callback(res.data)

  //解决TypeError: callback is not a function的报错 END

Q:没有触发同个组件文件夹下index.js中声明的onLike事件

A:在同个组件文件夹下index.wxml中,没用bind:myLike="onLike"绑定onLike事件

Q:a=b==c怎么运算的

Q:点击点赞按钮时,数据库点赞数加2,取消点赞按钮时数据库点赞数减2是什么原因导致这种bug?

A:检查后台和前台代码,是不是传访问路径后,重复处理了点赞数的加减,如果前台代码处理过了点赞数的加减,那么后台处理点赞数的加减的部分就要注释掉

前台
后台

Q:status = status === 'like' ? 1 : 0;是不是写多余了,有没有别的写法?

A:目前我尝试了,status = status === 'like';和status == 'like' ? status =1 : status =0;和status = status === 'like' ? 1 : 0;的效果是一样的。暂时我认为是写多余了。status = status === 'like' ? 1 : 0;可以理解成status = (status === 'like' ? 1 : 0);

C语言中a=b==c这个式子相当于先算b==c,若二者相等,则将1赋值给a,否则将0赋值给a,那么我个人推理js中a=b===c这个式子相当于先算b===c,若二者相等,则将1赋值给a,否则将0赋值给a




微信小程序:a=b===c,自己项目经验的Q&A,点赞数界面和数据库同步更新【诗书画唱】的评论 (共 条)

分享到微博请遵守国家法律