【Vue】06 Vue技术——Vue 中 `el` 与 `data` 的两种写法总结

文章目录

    • 前言
    • [一、`el` 的两种写法](#一、el 的两种写法)
      • [1. 在创建实例时直接配置](#1. 在创建实例时直接配置)
      • [2. 先创建实例,再手动挂载](#2. 先创建实例,再手动挂载)
    • [二、`data` 的两种写法](#二、data 的两种写法)
      • [1. 对象式(适用于根实例)](#1. 对象式(适用于根实例))
      • [2. 函数式(推荐,尤其在组件中必须使用)](#2. 函数式(推荐,尤其在组件中必须使用))
    • [三、关键原则:不要在 Vue 管理的函数中使用箭头函数](#三、关键原则:不要在 Vue 管理的函数中使用箭头函数)
    • 四、完整代码
    • 五、总结

前言

在使用 Vue.js 进行开发时,正确理解并掌握 eldata 的配置方式对构建灵活、可维护的应用至关重要。本文将围绕这两个核心选项的两种常见写法进行系统性总结,并强调一个关键的编程原则。


一、el 的两种写法

el 用于指定 Vue 实例所要控制的 DOM 元素(即挂载点)。它有两种使用方式:

1. 在创建实例时直接配置

js 复制代码
new Vue({
    el: '#root',
    data: {
        name: '上高山'
    }
});

这是最常见、最直观的方式,在实例化时就完成挂载。

2. 先创建实例,再手动挂载

js 复制代码
const vm = new Vue({
    data: {
        name: '上高山'
    }
});
// 稍后通过 $mount 方法挂载
vm.$mount('#root');

这种方式提供了更大的灵活性,例如可以延迟挂载、条件挂载,或在异步操作完成后才将 Vue 实例绑定到 DOM。

注意$mount() 是 Vue 提供的用于手动挂载实例的方法,其参数为选择器字符串(如 '#root')或 DOM 元素。


二、data 的两种写法

data 用于定义 Vue 实例的响应式数据。根据使用场景不同,也有两种形式:

1. 对象式(适用于根实例)

js 复制代码
data: {
    name: '上高山'
}

在创建根 Vue 实例(即非组件)时,可以直接使用对象作为 data

2. 函数式(推荐,尤其在组件中必须使用)

js 复制代码
data() {
    return {
        name: '上高山'
    };
}
// 或
data: function() {
    return {
        name: '上高山'
    };
}

函数式写法确保每个组件实例拥有独立的数据副本,避免多个实例间数据相互污染。

重要提示

当你将来开发 Vue 组件(Component)时,data 必须是一个返回对象的函数。如果使用对象形式,Vue 会抛出警告甚至报错,因为对象是引用类型,多个组件实例会共享同一份数据,破坏组件的独立性。


三、关键原则:不要在 Vue 管理的函数中使用箭头函数

Vue 内部大量依赖 this 指向当前 Vue 实例。而箭头函数没有自己的 this,它会继承外层作用域的 this,从而导致 this 不再指向 Vue 实例。

❌ 错误示例:

js 复制代码
data: () => {
    console.log(this); // this 不是 Vue 实例!可能是 window 或 undefined
    return { name: '上高山' };
}

✅ 正确做法:

js 复制代码
data() {
    console.log(this); // this 是当前 Vue 实例
    return { name: '上高山' };
}

这一原则不仅适用于 data,也适用于 methodscomputed、生命周期钩子等所有由 Vue 管理的函数。


四、完整代码

css 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>el与data的两种写法</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>

    <!--
    data与el的2种写法
    1.el有2种写法
        (1).new Vue时候配置el属性。
        (2).先创建Vue实例,随后再通过vm.$mount('#root')指定el的值。

    2.data有2种写法
        (1).对象式
        (2).函数式
        如何选择:目前哪种写法都可以,以后学习到组件时,data必须使用函数式,否则会报错。

    3.一个重要的原则:
        由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了。
    -->

    <!-- 准备好一个容器-->
    <div id="root">
        <h1>你好,{{name}}</h1>
    </div>
    
    <script type="text/javascript">
        // 关闭生产环境提示
        Vue.config.productionTip = false // 阻止 vue 在启动时生成生产提示。

        // el的两种写法
        // const v = new Vue({
        //     //el:'#root', // 第一种写法
        //     data:{
        //         name:'上高山'
        //     }
        // })
        // console.log(v)
        // //v.$mount('#root') // 第二种写法
        // setTimeout(()=>{
        //     v.$mount('#root')
        // },3000);

        // data的两种写法
        new Vue({
            el:'#root',
            // data的第一种写法:对象式
            // data:{
            //     name:'上高山'
            // }

            // data的第二种写法:函数式
            data:function(){
                console.log('@@@', this) // 此处的this是vue实例对象
                return{
                    name:'上高山'
                }
            }
        })
    </script>
</body>
</html>

五、总结

配置项 写法一 写法二 使用建议
el 实例化时直接指定 el: '#root' 先创建实例,再调用 vm.$mount('#root') 根据是否需要延迟/动态挂载选择
data 对象 { name: '...' } 函数 () => ({ name: '...' }) 始终优先使用函数式,为组件开发做准备

最佳实践 :即使当前只是编写根实例,也建议统一使用 data() 函数写法,并避免在 Vue 管理的函数中使用箭头函数。这不仅能避免未来迁移至组件架构时的重构成本,也能养成良好的编码习惯。

通过掌握这些基础但关键的细节,你将能更稳健地使用 Vue 构建应用,为后续学习组件化开发打下坚实基础。

相关推荐
踩着两条虫5 小时前
VTJ.PRO 核心架构全公开!从设计稿到代码,揭秘AI智能体如何“听懂人话”
前端·vue.js·ai编程
用头发抵命7 小时前
Vue 3 中优雅地集成 Video.js 播放器:从组件封装到功能定制
开发语言·javascript·ecmascript
蓝冰凌7 小时前
Vue 3 中 defineExpose 的行为【defineExpose暴露ref变量】详解:自动解包、响应性与实际使用
前端·javascript·vue.js
奔跑的呱呱牛7 小时前
generate-route-vue基于文件系统的 Vue Router 动态路由生成工具
前端·javascript·vue.js
sp42a7 小时前
在 NativeScript-Vue 中实现流畅的共享元素转场动画
vue.js·nativescript·app 开发
柳杉8 小时前
从动漫水面到赛博飞船:这位开发者的Three.js作品太惊艳了
前端·javascript·数据可视化
TON_G-T8 小时前
day.js和 Moment.js
开发语言·javascript·ecmascript
Irene19919 小时前
JavaScript 中 this 指向总结和箭头函数的作用域说明(附:call / apply / bind 对比总结)
javascript·this·箭头函数
2501_921930839 小时前
ReactNative项目OpenHarmony三方库集成实战:react-native-appearance(更推荐自带的Appearance)
javascript·react native·react.js