vue组件、组件生命周期、组件分离模块化

一、组件(一个包含vue特定选项的javascript对象)(一切皆组件)

data选项(函数方法) - 定义数据,返回的属性将会成为响应式的状态

data为什么定义成函数?

函数有自己独立的作用域,当进行组件复用时,一个组件改变值不会引起另一个组件值改变,如果定义成对象,复用组件值会跟着变化

methods选项 - 定义方法,是一些用来更改状态与触发更新的函数

template选项 - 定义模板

components选项 - 注册组件

directives选项 - 指令注册

props选项 - 接收外部传入的数据(可定义数组、也可定义对象)

emits选项 - 接收事件

computed计算属性

watch侦听属性

生命周期钩子选项

expose选项 - 暴露可被外部访问的私有方法

provide(函数)/inject选项 - 依赖注入

mixins选项 - 混入

name选项 - 定义组件名称,缓存组件时使用

inheritAttrs - 阻止属性透传

传入createApp的对象实际上就是一个组件(根组件)

组件定义、注册、使用

xml 复制代码
<!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>
    <script src="../lib/vue.global.js"></script>
</head>
<body>
    <div id="app"></div>
    <script>
        const { createApp } = Vue
        //子组件
        const ComA = {
            data() {
                return {
                    count: 0
                }
            },

            methods: {
                add() {
                    this.count++
                }
            },

            /* html */
            template: `<div>
                <button @click="add">+{{count}}</button>
                </div>`
        }
        //创建根组件
        const root = {
            //局部注册组件
            components: {
                ComA
            },

            // data为什么定义成函数, 函数有独立的作用域,当进行组件复用时,一个组件改变值不会引起另一个组件值改变,如果定义成对象,复用组件值会跟着变化
            data() {
                return {
                    title: '根组件'
                }
            },
            methods: {
                get() {}
            },
            /* html */
            template: `<div>
                <h1>{{title}}</h1>
                <ComA></ComA>
                <com-a></com-a>
                <button @click="get">确定</button>
                </div>`
        }

        const app = createApp(root)
        // app.component('ComA', ComA) // (组件名,组件对象)先全局注册组件,再挂载mount
        app.mount('#app')
    </script>
</body>
</html>

二、组件生命周期(创建->挂载->更新->卸载(销毁))

vue3:

setup(组合式API) ->beforeCreate->created->beforeMount->mounted->beforeUpdate->updated->beforeUnmount->unmounted

created生命周期数据初始化完成

mounted生命周期中可以操作dom节点元素

xml 复制代码
<!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>生命周期</title>
    <script src="../lib/vue.global.js"></script>
</head>
<body>
    <div id="app"></div>
    <script>
        const { createApp } = Vue
        const ButtonCounter = {
            data() {
                return {
                    count: 0,
                    list: []
                }
            },

            setup(props) {
                console.log('setup >>>');
            },

            // 创建生命周期
            beforeCreate() {
                console.log('beforeCreate >>>')
            },
            created() {
                console.log('created >>>', document.querySelector('#btn1'))//null
            },

            //挂载生命周期
            beforeMount() {
                console.log('beforeMount >>>')
            },
            mounted() {
                console.log('mounted >>>', document.querySelector('#btn1'))
            },

            // 更新生命周期
            beforeUpdate() {
                console.log('beforeUpdate >>>')
            },
            updated() {
                console.log('updated >>>')
            },

            // 卸载生命周期
            beforeUnmount() {
                console.log('beforeUnmount >>>')
            },
            unmounted() {
                console.log('unmounted >>>')
            },

            /*html*/
            template: `<button id="btn1" @click="count++">加一 {{count}}</button>`

        }

        const RootApp = {
            components: {
                ButtonCounter
            },

            data() {
                return {
                    title: '生命周期',
                    state: true
                }
            },

            methods: {
                closeButtonCouter() {
                    this.state = false
                }
            },

            /*html*/
            template: `<div>
                        <h2>{{title}}</h2>
                        <button-counter v-if="state"></button-counter>
                        <button @click="closeButtonCouter">关闭</button>
                    </div>`
        }

        createApp(RootApp).mount('#app')
    </script>
</body>
</html>

vue2:

beforeCreate->created->beforeMount->mounted->beforeUpdate->updated->beforeDestroy->destroyed

三、组件分离模块化

  • es6模块化规范 - 客户端 (浏览器已经支持 chrome)

script标签中要加type="module" <script type="module"> </script>

暴露 export say 导入import {say,num} from 'a.js' 调用say()

暴露export default say 导入 import sayEat from 'a.js' 调用sayEat()

export暴露,引入时名字不能改,并且要加{}

export default暴露,引入时名字可以改,不用加{}

一般暴露多个用export,暴露一个用export default

  • commonjs模块化规范 - 服务端

暴露module.exports = {} 导入const AModuel = require('a.js')

module.exports暴露,require导入

目录

index.html

xml 复制代码
<!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>首页 </title>
</head>
<body>
    <div id="app"></div>
    <script type="module" src="./src/main.js"></script>
</body>
</html>

main.js

javascript 复制代码
 // 使用vue3 ES模块构建版本
 import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
 
 // 导入根组件
 import App from './App.js'
 createApp(App).mount('#app')

App.js

css 复制代码
import ComA from "./ComA.js";
export default {
  components: {
    ComA,
  },

  data() {
    return {
      title: "模块化",
    };
  },

  methods: {
  },

  /*html*/
  template: `<div style="width:400px;height:400px;background-color:skyblue;">
                <h2>{{title}}</h2>
                <com-a></com-a>
            </div>`,
};

ComA.js

javascript 复制代码
export default {
    data() {
      return {
        count: 0,
      };
    },

    created() {
    },

    methods: {
    },

    /*html*/
    template: `<div style="width:200px;height:300px;background-color:pink;">
                      <p>{{ count }}</p>
                </div>`,
  };
相关推荐
mldong6 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排7 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60618 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角9 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!9 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰9 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi10 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen11 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马12 小时前
AI源码分析:拆解模型底层实现逻辑
前端
IT_陈寒12 小时前
React子组件莫名其妙重渲染?你可能漏了这个Hook
前端·人工智能·后端