unicloud27-小案例13 对修改页面进行数据渲染和分析

45 阅读1分钟

修改

修改页面和新增页面布局一样,就是新增的页面输入框是空的,修改是有内容的

复制新增页面的样式到edit中修改就可以用了,然后在detail页面中给修改按钮添加跳转点击事件

detail.vue

    methods: {
      // 跳转到修改页面
      goEdit(){
        uni.navigateTo({
          url:"/pages/edit/edit?id="+id
        })
      },

在详情页点击修改按钮之后,就跳转到修改页面了 image.png

然后在修改页面的onload方法中,直接接收这个参数,可以拿到id

    onLoad(e) {
      console.log(e);
    },

在详情页中点击修改按钮后,进入修改页面,就能通过onload生命周期函数拿到新闻对应id了 image.png

通过网络请求把要修改的内容展示到页面中

修改功能要先把需要修改的新闻通过id把数据请求到前端,并展示到页面中,方便用户修改,而之前做的添加功能是不需要这一步的,添加页面是空白的

<script>
  // 因为要通过详情页传过来的id获取数据,所以要定义一个全局id
  let id;
  export default {
    data() {
      return {
        formValue:{
          title:"",
          author:"",
          content:""
          
        }
      };
    },
    onLoad(e) {
      // 把获取到的id赋值给全局id,这样整个页面哪里都能直接使用id了
      id=e.id
      // 调用获取新闻详情的方法,一进入页面就获取数据
      this.getDetail()
    },
    methods:{
      // 获取要修改新闻的详情
      getDetail(){
        uniCloud.callFunction({
          name:"art_get_row",
          data:{
            // id:id
            id
          }
        }).then(res=>{
          console.log(res);
        })
      },

返回值写res和res.result.data[0]的区别: res

image.png

res.result.data[0] image.png

拿到数据后,渲染到页面

将获取到的数据保存到data中,然后在DOM体中渲染到页面

这组数据是之前添加页面定义的,就可以直接用这个做就行,将修改页面拿到的数据在获取到数据后就直接赋值

    data() {
      return {
        formValue:{
          title:"",
          author:"",
          content:""
          
        }
      };
    },

将获取到的值直接赋值给formValue

<template>
  <view class="edit">
    <form @submit="onSubmit">
      <view class="item">
        <!-- 标题输入框 -->
        <input v-model="formValue.title" type="text" name="title" placeholder="请输入标题"></input>
      </view>

      <view class="item">
        <!-- 作者输入框 -->
        <input v-model="formValue.author" type="text" name="author" placeholder="请输入作者"></input>
      </view>

      <view class="item">
        <!-- 多行输入框 -->
        <textarea v-model="formValue.content" name="content" placeholder="请输入内容"></textarea>
      </view>

      <view class="item">
        <button form-type="reset">重置</button>
        <!-- 对按钮进行双向绑定,这样用户每次输入值才能动态的调用判断方法 判断按钮 -->
        <button form-type="submit" type="primary" :disabled="inDisabled(formValue)">提交</button>
      </view>
    </form>
  </view>
</template>

<script>
  // 因为要通过详情页传过来的id获取数据,所以要定义一个全局id
  let id;
  export default {
    data() {
      return {
        formValue:{
          title:"",
          author:"",
          content:""
          
        }
      };
    },
    onLoad(e) {
      // 把获取到的id赋值给全局id,这样整个页面哪里都能直接使用id了
      id=e.id
      // 调用获取新闻详情的方法,一进入页面就获取数据
      this.getDetail()
    },
    methods:{
      // 获取要修改新闻的详情
      getDetail(){
        uniCloud.callFunction({
          name:"art_get_row",
          data:{
            // id:id
            id
          }
        }).then(res=>{
          console.log(res.result.data[0]);
          this.formValue = res.result.data[0]
        })
      },
      // 判断按钮的是否禁用
      // 这里是通过obj接收值所以不用写this,不传值也可以,写上this.一样
      inDisabled(obj){
        // 循环判断key的三个值是否为空,不为空就返回true,使按钮变为可用状态
        for(let key in obj){
          // obj[key]和obj.key一样的效果,打印出来的值就是用户输入的值
          // console.log(obj[key]);
          if(!obj[key]){
            return true
          }
        }
      },
      // 点击提交触发此方法
      onSubmit(e){
        // 获取到用户输入并赋值
        let detail=e.detail.value
        // 接收云函数传过来的值
        uniCloud.callFunction({
          name:"art_add_row",
          // 将获取到的用户输入传递到服务器
          data:{
            // detail:detail
            detail
          }
        }).then(res=>{
          uni.showToast({
            title:"发布成功"
          }),
          // 给跳转加一个延时,要不然看不到发布成功的提示框
          setTimeout(()=>{
            uni.reLaunch({
              url:"/pages/index/index"
            })
          },800)
          
        })
      }
    }
  }
</script>

接下来就是根据id把新的内容覆盖旧的内容就行了

    methods:{
      // 获取要修改新闻的详情
      getDetail(){
        uniCloud.callFunction({
          name:"art_get_row",
          data:{
            // id:id
            id
          }
        }).then(res=>{
          console.log(res.result.data[0]);
          this.formValue = res.result.data[0]
        })
      },

在详情页点击修改进入修改页面后就是这样了 image.png

修改页面全部的代码: 更新数据库的数据在下一节

<template>
  <view class="edit">
    <form @submit="onSubmit">
      <view class="item">
        <!-- 标题输入框 -->
        <input v-model="formValue.title" type="text" name="title" placeholder="请输入标题"></input>
      </view>

      <view class="item">
        <!-- 作者输入框 -->
        <input v-model="formValue.author" type="text" name="author" placeholder="请输入作者"></input>
      </view>

      <view class="item">
        <!-- 多行输入框 -->
        <textarea v-model="formValue.content" name="content" placeholder="请输入内容"></textarea>
      </view>

      <view class="item">
        <button form-type="reset">重置</button>
        <!-- 对按钮进行双向绑定,这样用户每次输入值才能动态的调用判断方法 判断按钮 -->
        <button form-type="submit" type="primary" :disabled="inDisabled(formValue)">提交</button>
      </view>
    </form>
  </view>
</template>

<script>
  // 因为要通过详情页传过来的id获取数据,所以要定义一个全局id
  let id;
  export default {
    data() {
      return {
        formValue:{
          title:"",
          author:"",
          content:""
          
        }
      };
    },
    onLoad(e) {
      // 把获取到的id赋值给全局id,这样整个页面哪里都能直接使用id了
      id=e.id
      // 调用获取新闻详情的方法,一进入页面就获取数据
      this.getDetail()
    },
    methods:{
      // 获取要修改新闻的详情
      getDetail(){
        uniCloud.callFunction({
          name:"art_get_row",
          data:{
            // id:id
            id
          }
        }).then(res=>{
          console.log(res.result.data[0]);
          this.formValue = res.result.data[0]
        })
      },
      // 判断按钮的是否禁用
      // 这里是通过obj接收值所以不用写this,不传值也可以,写上this.一样
      inDisabled(obj){
        // 循环判断key的三个值是否为空,不为空就返回true,使按钮变为可用状态
        for(let key in obj){
          // obj[key]和obj.key一样的效果,打印出来的值就是用户输入的值
          // console.log(obj[key]);
          if(!obj[key]){
            return true
          }
        }
      },
      // 点击提交触发此方法
      onSubmit(e){
        // 获取到用户输入并赋值
        let detail=e.detail.value
        // 接收云函数传过来的值
        uniCloud.callFunction({
          name:"art_add_row",
          // 将获取到的用户输入传递到服务器
          data:{
            // detail:detail
            detail
          }
        }).then(res=>{
          uni.showToast({
            title:"发布成功"
          }),
          // 给跳转加一个延时,要不然看不到发布成功的提示框
          setTimeout(()=>{
            uni.reLaunch({
              url:"/pages/index/index"
            })
          },800)
          
        })
      }
    }
  }
</script>

<style lang="scss" scoped>
  .edit {
    padding: 30rpx;

    .item {
      padding-bottom: 20rpx;

      input,
      textarea {
        border: 1rpx solid #eee;
        height: 80rpx;
        padding: 0 20rpx;
      }

      textarea {
        height: 200rpx;
        // 文本域有原生的宽度,所以设置这个属性
        width: 100%;
        // 这里有一个问题,原本在app.vue里是设置了怪异盒模型的
        // 使添加的边距向父盒子内压缩
        // 但是这里没有起效果,使得给文本域加了宽度为100%后
        // 文本域的右边就顶到屏幕右边了
        // 所以给他加一个标准盒模型,使父盒子的外边距再把它顶回来
        // 但是只是右边顶到了屏幕上,左边没有,就不知道什么情况
        box-sizing: border-box;
      }

      button {
        margin-bottom: 20rpx;
      }
    }
  }
</style>