封装vue2局部组件都要注意什么

news/2024/7/9 23:41:54 标签: 前端, javascript, vue, computed, watch, slot, vuex

一. 关于局部组件组成的三个部分(template, script, style)

  1. template  =>  组件的模板结构  (必选)

  • 每个组件对应的模板结构,需要定义到template节点中
<template>
    <!-- 当前组件的dom结构,需要定义到template结构的内部 -->
</template>
  • template中使用的指令
<template>
    <!-- 【1.内容渲染指令】 -->
    <span v-text="msg"></span>
    <span>{{msg}}</span>
    <div v-html="html"></div>

    <!-- 【2.属性绑定指令】 -->
    <img v-bind:src="imageSrc">

    <!-- 【3.双向指令绑定指令】 -->
    <select v-model=""></select>

    <!-- 【4.循环渲染指令】 -->
    <div v-for="(item, index) in items"></div>

    <!-- 【5.条件渲染】 -->
    <div v-if="Math.random() > 0.5">Now you see me</div>
    <div v-else-if="type === 'B'"></div>
    <div v-else>Now you don't</div>
</template>
  • template定义根节点

注:vue 2.x版本中,<template>节点内dom结构仅支持单个根节点;但在vue 3.x版本中,支持多个根节点

  1. script  =>  组件的javascript行为  (可选)

  • script中的data节点(可以定义当前组件渲染期间需要用到的数据对象;data是一个函数)
  • script中的methods节点(可以定义组件中的事件处理函数)
  1. style  =>  组件的样式  (可选)

  • style的lang属性支持可选值css,less,sass,scss
  • 当使用less或sass时,要先安装less或sass依赖,再设置lang的属性值为less或sass
  • scss是sass3.0引入的语法,可以理解scss是sass的一个升级版本,弥补sass和css之间的鸿沟
  • 合理使用scoped,因为使用scoped可以让样式只对当前组件生效

二. 关于生命周期

  • beforeCreate
  • created
  • beforeMounted
  • mounted
  • beforeUpdate
  • updated
  • beforeDestory
  • destoryed

created和mounted的区别:created在模板渲染成html前调用,mounted在模板渲染成html后调用

三. 关于父子组件的传值

封装出来的通用组件叫子组件,引用通用组件的界面叫做父组件,组件的封装必须高性能低耦合

1. 父组件向子组件传参用props

<!-- 父组件 -->
<template>
    <Child :articleList="articleList"></Child>
</template>

<!-- 子组件 -->
<template>
    <div>
        <ul>
            <li v-for="(value,index) in articleList" :key="index">{{value}}</li>
        </ul>
    </div>
</template>

<script>
    export default {
        name: "Child",
        props: {
            articleList: {
                type: array,
                default: function () {
                    return []
                }    
            }
        },//接收父组件传来的数据articleList
    }
</script>

2. 子组件向父组件传参用emit

<!-- 父组件 -->
<template>
    <common-dialog @pushId="getId"></common-dialog>
</template>
<script>
    methods: {
        getId (id) {}
    }
</script>

<!-- 子组件 -->
<template>
    <div>
         <input type="button" @click="emitIndex(id)" value="向父组件发送数据">
    </div>
</template>
<script>
    export default {
        methods: {
            emitIndex (id) {
                this.$emit('pushId', id)
            }
        }
    }
</script>

四. 关于computedwatch

1. computedwatch的区别:

  • computed是计算属性,watch是监听,监听data中的数据变化
  • computed支持缓存,即当其依赖的属性值发生变化时,计算属性会重新计算,反之则使用缓存中的属性值;watch不支持缓存,当对应属性发生变化的时候,响应执行
  • computed不支持异步,有异步操作时无法监听数据变化;watch支持异步

2. computedwatch的使用场景

javascript"><template>
    <div>
        {{ changewords }}
    </div>
</template>
<script>
    export default {
       data () {
          myname: 'aBcDEf'
       },
       computed: {
          changewords(){
            return this.myname.substring(0,1).toUpperCase()
          }
       }   
    }
</script>
javascript"><template>
     <div>
       <p>FullName: {{fullName}}</p>
       <p>FirstName: <input type="text" v-model="firstName"></p>
     </div>
</template>
<script>
    export default{
        data () {
          firstName: 'Dawei',
          lastName: 'Lou',
          fullName: ''
        },
        watch: {
          firstName(newName, oldName) {
            this.fullName = newName + ' ' + this.lastName;
          }
          // firstName: {
          //     handler(newName, oldName) {
          //        this.fullName = newName + ' ' + this.lastName;
          //     },
          //     immediate: true
          // }
        }
    }
</script>

五. 关于mixin

局部混入中mixin的文件就是一个对象,这个对象可以包含vue组件的一些常见的配置,包括data,methods,生命周期的钩子函数等等。

不同组件中的mixin是相互独立的。

  • mixin的使用

javascript"><!-- 引用mixins的文件 -->
<script>
    import queryList from "@/common/mixin/queryList";
    export default{
        mixins: [queryList]
    }
</script>

<!-- mixins的文件 -->
export const mixins = {
  data() {
    return {};
  },
  computed: {},
  created() {},
  mounted() {},
  methods: {},
};

六. 关于slot的使用

<!-- 子组件使用插槽slot   Link.vue-->
<template>
  <a :href="href" rel="external nofollow"  class="link">
    <!-- 留个插槽,外界传入内容放置在这里 -->
    <slot></slot>
  </a>
</template>

<!-- 父组件调用子组件 -->
<template>
  <div class="app">
    <Link href="https://baidu.com" rel="external nofollow" > 百度</Link>
    <Link href="https://google.com" rel="external nofollow"  style="margin-top: 10px">
      <!-- 这里允许放置任意的内容,包括字符串和标签 -->
      <span>Icon</span>谷歌</Link
    </Link>
  </div>
</template>

七. 关于vuex

vuex的五个组成部分:state,mulations,action,getters,modules

  • state:定义了应用程序的状态,即要管理的数据
javascript">const store = new Vuex.Store({
  state: {
    count: 0
  }
})
  • getters:用于获取state中的状态,类似vue组件中的计算属性
javascript">const store = new Vuex.Store({
  state: {
    count: 0
  },
  getters: {
    doubleCount(state) {
      return state.count * 2
    }
  }
})
  • mulations:修改state的数据
javascript">const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    },
    add(state, payload) {
      state.count += payload
    }
  }
})
  • action:用于异步操作和提交mulations,在actions中可以进行任何异步操作,最后再提交到mulations中同步修改state
javascript">const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++
    }
  },
  actions: {
    incrementAsync(context) {
      setTimeout(() => {
        context.commit('increment')
      }, 1000)
    }
  }
})
  • modules:用于将store分割成模块,每个模块都拥有自己的state, getters, mulations, action和子模块,以便提高应用程序的可维护性
javascript">const store = new Vuex.Store({
  modules: {
    cart: {
      state: {
        items: []
      },
      mutations: {
        addItem(state, item) {
          state.items.push(item)
        }
      },
      actions: {
        addAsyncItem(context, item) {
          setTimeout(() => {
            context.commit('addItem', item)
          }, 1000)
        }
      }
    }
  }
})


http://www.niftyadmin.cn/n/4936058.html

相关文章

uniapp实现自定义上传图片

目录 1、布局样式2、使用uniappAPI&#xff08;uni.chooseImage&#xff09;3、解决bug和添加功能3.1 bug13.2 bug23.3 bug33.4 点击图片进行预览3.5 删除图片 4、云函数上传到云存储 1、布局样式 在正式自定义上传前我们先将静态页面搭建好。 样式代码&#xff1a; <temp…

深度学习快速入门系列---损失函数

在深度学习中,损失函数的作用是量化预测值和真实值之间的差异,使得网络模型可以朝着真实值的方向预测,损失函数通过衡量模型预测结果与真实标签之间的差异,反映模型的性能。同时损失函数作为一个可优化的目标函数,通过最小化损失函数来优化模型参数。在本篇文章中,我们介…

9.利用matlab完成 泰勒级数展开 和 符号表达式傅里叶变换和反变换 (matlab程序)

1.简述 matlab之傅里叶变换和逆变换 首先生成一个方波&#xff08;或者其他组合波形&#xff09;&#xff0c;然后对这个信号做傅里叶变换&#xff0c;拆解到频域&#xff0c;可以看到这个信号是由哪些频率的信号叠加而来。 然后把频域信号&#xff0c;用傅里叶逆变换恢复到时…

heap pwn 入门大全 - 2:glibc heap机制与源码阅读(下)

本文对glibc堆管理器的各项主要内存操作&#xff0c;以及glibc 2.26后引入的tcache机制进行源码级分析&#xff0c;可作为查找使用。 glibc memory operations 第一次malloc&#xff0c;会初始分配一个0x290的chunk&#xff0c;top chunk split返回给user后&#xff0c;剩余部…

macOS使用ffmpeg与QT进行音视频推拉流

1.先启动流服务器 ./mediamtx 2.开始推流: ffmpeg -re -stream_loop -1 -i /Users/hackerx/Desktop/test.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 3. 安装ffmpeg 4.4 brew install ffmpeg4 4.添加ffmpeg头文件目录与库目录 5.链接ffmpeg相关库…

实践教程|基于 pytorch 实现模型剪枝

PyTorch剪枝方法详解&#xff0c;附详细代码。 一&#xff0c;剪枝分类 1.1&#xff0c;非结构化剪枝 1.2&#xff0c;结构化剪枝 1.3&#xff0c;本地与全局修剪 二&#xff0c;PyTorch 的剪枝 2.1&#xff0c;pytorch 剪枝工作原理 2.2&#xff0c;局部剪枝 2.3&#…

Spring Boot/Cloud 端口设置、端口随机、端口自增如何实现?

Spring Boot/Cloud 端口设置、端口随机、端口自增如何实现&#xff1f; Spring Boot 、Spring Cloud支持固定端口和随机端口2种方式&#xff0c;但是这两种方式都不利于管理固定端口容易冲突&#xff0c;特别是在Spring Cloud下&#xff0c;用起来很麻烦随机端口看似解决了端口…

【CI/CD】基于 Jenkins+Docker+Git 的简单 CI 流程实践(上)

基于 JenkinsDockerGit 的简单 CI 流程实践&#xff08;上&#xff09; 在如今的互联网时代&#xff0c;随着软件开发复杂度的不断提高&#xff0c;软件开发和发布管理也越来越重要。目前已经形成一套标准的流程&#xff0c;最重要的组成部分就是 持续集成 及 持续交付、部署。…