美文网首页
[vue3新特性] 6.组合api——7.小例子

[vue3新特性] 6.组合api——7.小例子

作者: 林哥学前端 | 来源:发表于2021-10-16 08:16 被阅读0次

    现在我们学习组合API的内容已经不少了,我们用它来重写一下我们之前写过的一个小例子:超级英雄管理系统
    我们新建一个项目,把App.vue中没用的内容都删除掉

    <template>
      <h1>超级英雄管理系统</h1>
    </template>
    
    <script>
    export default {
      name: 'App',
      setup() {
      },
    }
    </script>
    

    1.展示超级英雄列表

    定义一个heroList,然后用v-for把它循环出来,相信大家已经很熟悉了,我就直接上代码了

    <template>
      <h1>超级英雄管理系统</h1>
      <ul>
        <li v-for="item in heroList" :key="item">
          <span>{{ item }}</span>
        </li>
      </ul>
    </template>
    
    <script>
    import { reactive } from 'vue'
    export default {
      name: 'App',
      setup() {
        const heroList = reactive(['钢铁侠', '蜘蛛侠', '美国队长'])
        return {
          heroList,
        }
      },
    }
    </script>
    

    2.使用计算属性显示超级英雄的总数

    const total = computed(() => {
       return heroList.length
    })
    
    <div>现在注册在案的超级英雄有{{ total }}位</div>
    

    当然需要在setup中return total这个数据了,我这里就不写了
    现在的结果是


    3.添加超级英雄弹框
    我们添加一个按钮,点击后出现弹框,在弹框中输入超级英雄的名字,然后点击确定就可以添加了
    js逻辑部分

        const showAddModal = ref(false)     // 是否显示弹框
        const addHeroName = ref('')         // 名字输入框的值
        const onAddHeroClick = () => {      // 点击添加超级英雄按钮回调
          showAddModal.value = true
        }
        const onAddHeroSubmit = () => {     // 点击确定按钮的回调
          heroList.push(addHeroName.value)
          showAddModal.value = false
          addHeroName.value = ''
        }
    
        return {
          heroList,
          total,
          showAddModal,
          addHeroName,
          onAddHeroClick,
          onAddHeroSubmit,
        }
    

    template部分

      <button @click="onAddHeroClick">添加超级英雄</button>
      <div class="add-modal" v-show="showAddModal">
        <div class="add-box">
          <input type="text" v-model="addHeroName" />
          <br />
          <button @click="onAddHeroSubmit">确定</button>
        </div>
      </div>
    

    这样添加功能就完成了


    4.删除超级英雄

    js部分

        const onDel = (index) => {
          heroList.splice(index, 1)
        }
    
        return {
          heroList,
          total,
          showAddModal,
          addHeroName,
          onAddHeroClick,
          onAddHeroSubmit,
          onDel,     // 新增
        }
    

    template部分

        <li v-for="(item, index) in heroList" :key="item">
          <span>{{ item }}</span>
          <span class="del" @click="onDel(index)">删除</span>
        </li>
    

    这样就完成了我们的超级英雄管理系统的基本功能了
    全部代码

    <template>
      <h1>超级英雄管理系统</h1>
      <ul>
        <li v-for="(item, index) in heroList" :key="item">
          <span>{{ item }}</span>
          <span class="del" @click="onDel(index)">删除</span>
        </li>
      </ul>
      <div>现在注册在案的超级英雄有{{ total }}位</div>
      <button @click="onAddHeroClick">添加超级英雄</button>
      <div class="add-modal" v-show="showAddModal">
        <div class="add-box">
          <input type="text" v-model="addHeroName" />
          <br />
          <button @click="onAddHeroSubmit">确定</button>
        </div>
      </div>
    </template>
    
    <script>
    import { computed, reactive, ref } from 'vue'
    export default {
      name: 'App',
      setup() {
        // 展示部分
        const heroList = reactive(['钢铁侠', '蜘蛛侠', '美国队长'])
        const total = computed(() => {
          return heroList.length
        })
    
        // 添加部分
        const showAddModal = ref(false)
        const addHeroName = ref('')
        const onAddHeroClick = () => {
          showAddModal.value = true
        }
        const onAddHeroSubmit = () => {
          heroList.push(addHeroName.value)
          showAddModal.value = false
        }
    
        // 删除部分
        const onDel = (index) => {
          heroList.splice(index, 1)
        }
    
        return {
          heroList,
          total,
          showAddModal,
          addHeroName,
          onAddHeroClick,
          onAddHeroSubmit,
          onDel,
        }
      },
    }
    </script>
    <style scoped>
    .add-modal {
      position: absolute;
      top: 0;
      bottom: 0;
      left: 0;
      right: 0;
      background-color: rgba(0, 0, 0, 0.5);
    }
    .add-box {
      position: absolute;
      left: 0;
      bottom: 0;
      width: 100%;
      height: 25vh;
      background-color: #fff;
      text-align: center;
      padding-top: 15vh;
    }
    .del {
      margin-left: 5px;
      color: red;
      cursor: pointer;
    }
    </style>
    

    现在我们使用组合API的优势稍微显示出来了,把同一业务逻辑的代码放在了一起,
    展示部分、添加部分和删除部分分块写好,方便开发与维护
    而不是像以前一样数据写在一起、方法写在一起了

    5.把逻辑代码分到不同的文件中

    现在我们写的js代码也没多少,看着也没什么问题,但是在实际开发中,一个vue文件中的逻辑代码可能上千行,维护起来就特别麻烦,所以我们要把展示、添加、删除的逻辑分别放到不同的文件中
    在src目录下建立一个文件夹hero,用于放我们的独立文件,然后新建三个文件

    useShow
    useAdd
    useDel

    根据惯例或者说从react那学来的方式,这些文件我们以use开头
    把我们相关模块的代码放到文件中

    useShow.js

    import { reactive, computed } from 'vue'
    const heroList = reactive(['钢铁侠', '蜘蛛侠', '美国队长'])
    const total = computed(() => {
      return heroList.length
    })
    
    export { heroList, total }
    

    useAdd.js

    import { ref } from 'vue'
    function useAdd(heroList) {
      const showAddModal = ref(false)
      const addHeroName = ref('')
      const onAddHeroClick = () => {
        showAddModal.value = true
      }
      const onAddHeroSubmit = () => {
        heroList.push(addHeroName.value)
        showAddModal.value = false
        addHeroName.value = ''
      }
      return {
        showAddModal,
        addHeroName,
        onAddHeroClick,
        onAddHeroSubmit,
      }
    }
    
    export default useAdd
    

    useDel.js

    function useDel(heroList) {
      const onDel = (index) => {
        heroList.splice(index, 1)
      }
      return {
        onDel,
      }
    }
    
    export default useDel
    

    最后在App.vue中使用

    import { heroList, total } from './hero/useShow'
    import useAdd from './hero/useAdd'
    import useDel from './hero/useDel'
    export default {
      name: 'App',
      setup() {
        const {
          showAddModal,
          addHeroName,
          onAddHeroClick,
          onAddHeroSubmit,
        } = useAdd(heroList)
        const { onDel } = useDel(heroList)
    
        return {
          heroList,
          total,
          showAddModal,
          addHeroName,
          onAddHeroClick,
          onAddHeroSubmit,
          onDel,
        }
      },
    }
    </script>
    

    这样看上去是更麻烦了,但是对于复杂的组件来说,这样拆分以后,在维护的时候不管是读代码、还是改代码都方便了。
    这节课就到这里了。

    相关文章

      网友评论

          本文标题:[vue3新特性] 6.组合api——7.小例子

          本文链接:https://www.haomeiwen.com/subject/yghuoltx.html