<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Vue.js Todo List 全选功能实现及优化</title>
    <script src="./vue.js"></script>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      li {
        list-style: none;
        text-indent: 0;
      }
      li:hover {
        background-color: #f4f4f4;
      }
      li:hover .del {
        display: inline-block;
      }
      .del {
        display: none;
      }
<pre><code>  #app {
    width: 600px;
    margin: 100px auto;
    border: 1px solid pink;
    padding: 10px;
    display: flex;
    flex-direction: column;
  }
  .fl {
    float: left;
  }
  .fr {
    float: right;
  }
&lt;/style&gt;
</code></pre>
  </head>
  <body>
    <div id="app">
      <headers @add-event="addEvent"></headers>
      <mains
        :list="list"
        @del-event="delEvent"
        :is-all="isAll"
        @change-is-all="changeIsAll"
      ></mains>
      <!-- // !一定要记住自定义事件监听要使用@或者c-on -->
      <footers @all-select="allSelect" :is-all="isAll"></footers>
    </div>
    <!-- headers -->
    <script type="text/html" id="headers">
      <input
        style="text-indent: 1em;height: 30px;"
        type="text"
        placeholder="请输入待办事项"
        v-model="val"
        @keyup.enter="add"
      />
    </script>
    <!-- mains -->
    <script type="text/html" id="mains">
      <ul>
        {{checkboxList}}
        <li
          v-for="(item,index) in list"
          :key="index"
          style="height: 40px; line-height: 40px;"
        >
          <input type="checkbox" v-model="checkboxList" :value="item" />
          {{item}}
          <button
            @click="del(index)"
            style="margin-right: 0px;margin-top: 10px;"
            class="fr del"
          >
            删除
          </button>
          <hr />
        </li>
      </ul>
    </script>
    <!-- footers -->
    <script type="text/html" id="footers">
      <footer style="padding-top: 10px;">
        <input @change="all" type="checkbox" v-model="checkAll" />
        已完成{{}}件/总计{{}}件
        <button style="margin-right: 0px;" class="fr">清除已完成</button>
      </footer>
    </script>
    <script>
      // headers
      const headers = {
        template: "#headers",
        data() {
          return {
            val: ""
          };
        },
        methods: {
          add() {
            this.$emit("addEvent", this.val);
            this.val = "";
          }
        }
      };
      // mains
      const mains = {
        template: "#mains",
        props: ["list", "isAll"],
        data() {
          return {
            checkboxList: []
          };
        },
        methods: {
          del(val) {
            this.$emit("delEvent", val);
          },
          changeIsAll(val) {
            this.$emit("changeIsAll", val);
          }
        },
        watch: {
          isAll(val) {
            if (val) {
              this.checkboxList = this.list;
            } else {
              this.checkboxList = [];
            }
          },
          checkboxList() {
            //! 错误的地方
            //!this.list和this.checkboxList是两个不同的数组对象,即使它们的内容相同,它们的引用也不同,所以this.checkboxList === this.list永远会返回false。要判断两个数组是否具有相同的内容,可以使用数组的every方法来进行比较。
<pre><code>        // console.log(this.checkboxList === this.list);

        // if (this.checkboxList === this.list) {
        //   console.log(111);
        // }
        // if (this.list.every((item) =&gt; this.checkboxList.includes(item))) {
        //   this.changeIsAll(true);
        // } else {
        //   this.changeIsAll(false);
        // }
        if (this.list.every(item =&gt; this.checkboxList.includes(item))) {
          this.changeIsAll(true);
        } else {
          this.changeIsAll(false);
        }
      }
    }
  };
  // footers
  const footers = {
    template: &quot;#footers&quot;,
    props: [&quot;isAll&quot;],
    data() {
      return {
        checkAll: false
      };
    },
    methods: {
      all() {
        this.$emit(&quot;allSelect&quot;, this.checkAll);
      }
    },
    watch: {
      isAll() {
        this.checkAll = this.isAll;
      }
    }
  };
  // 父组件
  const app = {
    data() {
      return {
        list: [&quot;美美的睡上一觉&quot;, &quot;开心的吃大餐&quot;, &quot;吃饭&quot;, &quot;睡觉&quot;, &quot;打豆豆&quot;],
        isAll: false
      };
    },
    methods: {
      addEvent(val) {
        this.list.unshift(val);
      },
      delEvent(val) {
        this.list.splice(val, 1);
      },
      allSelect(val) {
        this.isAll = val;
      },
      changeIsAll(val) {
        console.log(val);
        this.isAll = val;
      }
    },
    components: {
      headers,
      mains,
      footers
    }
  };
  const vm = Vue.createApp(app);
  vm.mount(&quot;#app&quot;);
&lt;/script&gt;
</code></pre>
  </body>
</html>
<!-- 为什么这段代码全选后,再取消列表项中的任意一项代码,整个程序的复选框全部都取消?我想要的效果是取消哪一个列表项就只取消哪一个列表项 -->
Vue.js Todo List 全选功能实现及优化

原文地址: https://www.cveoy.top/t/topic/qnkS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录