jQuery、Vue和微信小程序 数据绑定 ‘待办事项‘ 小练习

一、jQuery?

需求

在这里插入图片描述

1.输入框中开始没有数据,确定按钮应该是disabled状态
2.当输入框中输入内容时,需要判断实时切换输入框的disabled 状态。例如:有内容,则按钮可用,没 有内容:按钮不可用
3.当点击确定按钮之后,获取输入框的值,填入到列表的最下方。并且要清空输入框的值,确定按钮变为不可用
4.在输入框中按回车,如果输入框有值,则填入到列表最下方,并且清空输入框,按钮不可用。如果输入框没有值,即空的时候,则回车无效
5.删除按钮点击后,能够删除对应的行
6.待办事项:刚开始是隐藏状态display: none ,当删除了所有项目后,则暂无待办事项变为可见状态.。当添加了新事项之后,暂无待办事项隐藏

代码实现

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      #box > div:last-child {
    
    
        color: green;
        border: 1px solid green;
        padding: 5px;
        border-radius: 3px;
        display: none;
      }
    </style>
  </head>
  <body>
    <div id="box">
      <div>
        <input type="text" placeholder="请输入待办事项" />
        <button disabled>确定</button>
      </div>
      <div>
        <ul>
          <li>
            <span>吃饭</span>
            <button>删除</button>
          </li>
          <li>
            <span>睡觉</span>
            <button>删除</button>
          </li>
          <li>
            <span>敲代码</span>
            <button>删除</button>
          </li>
        </ul>
      </div>
      <div>暂无待办事项</div>
    </div>

    <script src="./vendor/jquery-3.6.0.min.js"></script>
    <script>
      // 监听输入框的值 的实时变化, 修改 确定 按钮的 不可用状态
      $("input").on("input", function () {
    
    
        // 获取输入框的值
        let val = $(this).val()
        console.log(val)
        // 空字符串的判断方式: 1.长度==0  2. == ''
        // if: 会把 '' [] {} 0 0.0 null undefined 判断为false
        if (val == "") {
    
    
          // 是空字符串, 则确定按钮不可用
          // prop: 设置系统属性
          $(this).next().prop("disabled", true)
        } else {
    
    
          // "false": 这叫 字符串
          // false: 这是 boolean
          $(this).next().prop("disabled", false)
        }
      })
      // 按钮中, 包含 确定 文字的
      $("button:contains(确定)").click(function () {
    
    
        // 添加新元素: 把 暂无 隐藏
        $("#box>div:last-child").css("display", "none")
        let $input = $(this).prev() //当前元素 上方的元素
        // 制造新的元素, 用模板字符串 ``
        let el = `<li>
            <span>${
      
      $input.val()}</span>
            <button>删除</button>
          </li>`
        // 添加到 ul 的子元素的最后
        $("ul").append(el)
        $input.val("") //清空: 把输入框的值改为 空字符串
        // 不可用
        $input.next().prop("disabled", true)
      })
      $("input").keyup(function (e) {
    
    
        // 按键编号: 13  代表回车
        if (e.keyCode == 13) {
    
    
          // 输入框的值 的 长度 不是 0, 代表有值
          if ($(this).val().length != 0) {
    
    
            // 添加新元素, 隐藏 暂无
            $("#box>div:last-child").css("display", "none")
            let el = `<li>
            <span>${
      
      $(this).val()}</span>
            <button>删除</button>
          </li>`
            $("ul").append(el) //添加到子元素
            $("input").val("") //清空输入框
            $(this).next().prop("disabled", true) //按钮不可用
          }
        }
      })
      // 关于删除: 因为删除按钮特别多, 如果为每一个按钮添加事件, 需要非常多的事件函数, 浪费内存!
      // 新增按钮添加事件, 也比较繁琐
      // 如果是新增按钮, 应该写成 <button οnclick="del()">删除</button>
      // 需要额外搭配一个 del 函数, 实现绑定
      // 冒泡: 监听 ul 中, 所有button 触发的点击事件
      $("ul").on("click", "button", function () {
    
    
        // this: 代表按钮
        $(this).parent().remove() //移除按钮的父节点
        // 判断: 如果 ul 中没有子元素了, 则显示 暂无待办事项
        console.log("子元素:", $("ul").children())
        if ($("ul").children().length == 0) {
    
    
          // display:block;   显示出来
          $("#box>div:last-child").css("display", "block")
        }
      })
    </script>
  </body>
</html>

二、Vue

需求

在这里插入图片描述

1.输入框有值则按钮可用,没有值按钮不可用
2.回车/确定按钮:可以把值加入到下方列表的最后并清空输入框
3.奇数行和偶数行颜色不同
4.行越往下,字体大小越大每层+1
5.删除按钮点击后,删除对应行.所有行删除之后,则显示暂无待办事项

代码实现

<template>
  <div>
    <div>
      <!-- v-model: 双向绑定 -->
      <!-- 方向1: 数据 显示到DOM -->
      <!-- 方向2: 表单元素用户可以修改, DOM变化 同步更新给数据项 -->
      <input
        @keyup.13="addItem"
        v-model="todo"
        type="text"
        placeholder="请输入待办事项"
      />
      <!-- todo 变量变化时, 会自动更新相关的DOM元素 -->
      <button :disabled="todo == ''" @click="addItem">确定</button>
    </div>
    <div>
      <ul>
        <!-- 动态样式  :class="{样式类: true/false}" -->
        <li
          :class="{ even: index % 2 == 0, odd: index % 2 == 1 }"
          :style="{ fontSize: 18 + index + 'px' }"
          v-for="(todoItem, index) in todoItems"
          :key="index"
        >
          <span>{
    
    {
    
     todoItem }}</span>
          <!-- 数组数据的删除: splice(序号,个数) -->
          <button @click="todoItems.splice(index, 1)">x</button>
          <!-- Vue的核心: 改动数据, 自动变更DOM, 无需人为操作DOM -->
        </li>
      </ul>
    </div>
    <!-- v-show: 利用css的display:none 实现显示切换 -->
    <div v-show="todoItems.length == 0">暂无待办事项</div>
    <!-- 数组判空, 看长度 -->
  </div>
</template>

<script>
export default {
    
    
  //vdata
  data() {
    
    
    return {
    
    
      todoItems: ["吃饭", "睡觉", "敲代码"],
      todo: "",
    }
  },
  // vmethod
  methods: {
    
    
    addItem() {
    
    
      // 如果 输入框 没有内容, 则后续代码不执行
      if (this.todo == "") return
      // push: 把值添加到数组结尾
      this.todoItems.push(this.todo)
      // 清空输入框:  数据变更 DOM自动更新
      this.todo = ""
    },
  },
}
</script>

<style lang="scss" scoped>
ul {
    
    
  margin: 5px;
  padding: 0;
  > li {
    
    
    // & 代表当前的元素, 目前就是li
    // li.even : li标签 带有even 样式类
    &.even {
    
    
      background-color: green;
    }
    &.odd {
    
    
      background-color: yellow;
    }
    border: 1px solid gray;
    width: 200px;
    border-radius: 15px;
    margin: 4px 0;
    padding: 4px;
    display: flex;
    justify-content: space-between;
  }
}
</style>

三、微信小程序

需求

在这里插入图片描述

代码实现

.wxml:

<view class="h1">待办事项列表</view>
<view class="hr"></view>
<view class="todo-header">
  <input placeholder="请输入待办事项" type="text" bindinput="inputEvent" value="{
    
    {val}}"></input>
  <button type="primary" bindtap="tapAdd">添加新事项</button>
</view>
<view>
  <text wx:if="{
    
    {todos.length==0}}">提示:当前没有待办事项</text>
  <view class="todo-list-item" wx:for="{
    
    {todos}}" wx:key="*this">
    <text>{
    
    {
    
    index+1}}.{
    
    {
    
    item}}</text>
    <button type="warn" size="mini" bindtap="tapDel" data-i="{
    
    {index}}">删除</button>
  </view>
</view>

.wxss:

.h1{
    
    
  font-size:24px;
  margin-bottom:15rpx;
}
.hr{
    
    
  height:0;
  margin:10rpx 0;
  border-bottom: 1px solid #ccc;
}
.todo-header{
    
    
  display: flex;
  align-items: center;
}
.todo-header input{
    
    
  flex: 2;
  border:1px solid #ccc;
  padding:15rpx 10rpx;
  margin-right: 10rpx;
}
.todo-header button{
    
    
  flex: 1;
}
.todo-list-item{
    
    
  margin-top: 15rpx;
}
.todo-list-item{
    
    
  display: flex;
  align-items: center;
}
.todo-list-item text{
    
    
  font-size:18px;
  flex: 3;
}
.todo-list-item button{
    
    
  flex: 1;
}

.js:

Page({
    
    
    data: {
    
    
        todos:['吃饭','睡觉','打豆豆'],
        val:'' //绑定文本框中的值
    },
    //文本输入触发
    inputEvent(event){
    
    
        this.data.val=event.detail.value
    },
    //点击添加按钮事件
    tapAdd(){
    
    
        if(!this.data.val.trim()) return; //判断是否为空
        let todos=this.data.todos
        todos.push(this.data.val)
        this.setData({
    
    todos,val:''})
    },
    //点击删除
    tapDel(event){
    
    
        let i=event.target.dataset.i
        let todos=this.data.todos
        todos.splice(i,1)
        this.setData({
    
    todos})
    }
})

猜你喜欢

转载自blog.csdn.net/D_evin_/article/details/121977541