Vue基础精讲 —— 详解Vue实例、Vue实例的属性和方法

2023-10-27

Vue实例 —— 基本配置

在 build文件夹 下新建 webpack.config.practice.js 配置文件,内容参考:

const path = require('path')
const HTMLPlugin = require('html-webpack-plugin')
const webpack = require('webpack')
const merge = require('webpack-merge') // 合并对象
const baseConfig = require('./webpack.config.base') // 基础配置

const defaultPlugins= [
  new webpack.DefinePlugin({
    'process.env': {
      NODE_ENV: '"development"'
    }
  }),
  new HTMLPlugin()
]

const devServer = {
  port: 8080,
  host: '0.0.0.0',
  overlay: {
    errors: true,
  },
  hot: true
}

let config

config = merge(baseConfig, {
  entry: path.join(__dirname, '../practice/index.js'), // 入口文件
  devtool: '#cheap-module-eval-source-map',
  module:{
    rules:[
      {
        test: /\.styl/,
        use: [
          'vue-style-loader',
          'css-loader',
          {
            loader: 'postcss-loader',
            options: {
              sourceMap: true,
            }
          },
          'stylus-loader'
        ]
      }
    ]
  },
  devServer,
  resolve:{
    alias:{
      'vue': path.join(__dirname, '../node_modules/vue/dist/vue.esm.js')
    }
  },
  plugins: defaultPlugins.concat([
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoEmitOnErrorsPlugin()
  ])
})

module.exports = config

 注意:需要设置 alias 中 vue 指向,这里需要注意不同vue.js 的区别

'vue': path.join(__dirname, '../node_modules/vue/dist/vue.esm.js')

 在 node_modules/vue/dist/ 下有不同的vue.js,若不指定vue.js,项目默认使用的是.vue.runtime.esm.js(vue打包之后的代码),这份vue.js是不支持在Vue对象中使用template的。

若不设置alias指向,项目报错如图:

[Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build.

在package.json文件中新建一条启动命令

"practice": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.practice.js"

 

Vue实例 —— 创建,template创建Vue实例

通过template创建Vue实例,这种方式Vue会将template编译成一个render function,render function返回真正要显示在页面上的HTML代码,效率稍低。
代码示例:

import Vue from 'vue'

const div = document.createElement('div')
document.body.appendChild(div)

new Vue({
  el: div,
  template: '<div>this is content {{text}}</div>',
  data: {
    text: 'text'
  }
})

运行结果:

将template的内容挂载到div元素上,挂载过程是会把整个节点替换掉,因此在网页上看不到#root的元素

先定义document节点,再append到body中的方式,相对麻烦

可以注意到先加载了js,再加载真正的页面元素,比较奇怪

在真实的生产环境中,不建议这么操作,建议新建一个template.html文件,类似这样:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <div id="root"></div>
</body>
</html>

 修改 webpack.config.practice.js 配置文件,生成HTML文件时会根据 template.html为模板生成

const defaultPlugins= [
  new webpack.DefinePlugin({
    'process.env': {
      NODE_ENV: '"development"'
    }
  }),
  new HTMLPlugin({
    template: path.join(__dirname, 'template.html')
  })
]

有了这个template模板文件之后, 修改el值

import Vue from 'vue'

new Vue({
  el: '#root',
  template: '<div>this is content {{text}}</div>',
  data: {
    text: 'text'
  }
})

在新建Vue实例的时候,如若不传el参数,还能通过这种方式挂载

import Vue from 'vue'

const app = new Vue({
  template: '<div>this is content {{text}}</div>',
  data: {
    text: 'text'
  }
})
app.$mount('#root')

Vue实例 —— 创建,render function创建Vue实例

详见,Vue核心分解 —— render function创建Vue组件(实例)

Vue实例 —— 属性

app.$data // 数据
app.$props // 接受参数
app.$el // 挂载点

app.$options
  app.$options.data.text = 'text1' // 不会修改值
  app.$data.text = 'text1' // 可以修改值
  // $options上特殊的属性render
  app.$options.render = (h) => {
    // 需要有值变化,重新进行渲染之后才会生效
    return h('div', {}, 'new render function')
  }

app.$root === app // Vue实例

app.$children // 子组件

app.$slots // 插槽
app.$scopedSlots // 插槽

app.$refs

app.$isServer // 服务端渲染会用到

Vue实例 —— 方法

// 监听
const unWatch = app.$watch('text', (nextText, oldText) => {
  console.log(`${nextText} : ${oldText}`)
})
// 页面之间相互跳转,采用app.$watch方法监听,需手动注销,不然会导致内存溢出
// 手动注销发方法,app.$watch会返回一个unWatch方法,调用该方法即可
unWatch()

// 监听 只监听一次
app.$once('test', () => {
  console.log('test once')
})

// 触发事件
app.$emit('test') 

// 强制组件渲染,不建议使用,若没控制好频度,会一直强制渲染,影响性能
app.$forceUpdate()

// 真正dom节点渲染完成
app.$nextTick() 

// vue是一个响应式框架,若对象中某个值没有在Vue实例创建时声明,则对这个对象赋值时,属于非响应式,不会引起组件渲染
// 在声明Vue实例时,设置data中obj属性为{}空对象,若要对obj中a属性赋值
// 不会引起页面响应
app.obj.a = 1 
// 会引起页面响应
app.obj = {a: 1}
// 会引起页面响应
app.$set(app.obj, 'a', 1) 
// 通过app.$set设置的属性,若要删除,需要通过app.$delete()方法

// vue渲染过程是异步的,每次改一个值,并没有同步渲染到HTML上,而是有一个异步队列
// 若多次改变一个值,vue是一次性渲染出来的,而不是每次都会渲染出来
setInterval(() => {
  app.text += 1
  app.text += 1
}, 1000)
// 在页面上查看text值,会发现它是+2递增,而非+1递增

与君共勉:再牛逼的梦想,也抵不住傻逼般的坚持!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue基础精讲 —— 详解Vue实例、Vue实例的属性和方法 的相关文章

随机推荐

  • Human3.6M dataset(3D人体姿态估计)

    这里是数据集的部分数据 3D关节点 一般论文试验够用了 包括 演员1 5 6 7 8训练集 9 11测试集 共有15个动作场景 需要的自取 下载地址 http www cs stanford edu people ashesh h3 6m
  • UVM的构造函数new的个人理解

    构造函数new 自己总结的规律 理解 结合UVM实战这本书的阅读理解 归纳一下自己对new函数的个人理解 只是书本前几章阅读后的认知 还不能完善 在此只为记录防丢失 构造函数new 一般类的实例化 包含类的声明和类的构造 比如 my dri
  • Pytorch加速与优化:超参数调优、量化、剪枝

    Pytorch加速与优化 超参数调优 量化 剪枝 前言 前提条件 相关介绍 实验环境 超参数调优 hyper parameters 量化 quantization 动态量化 Dynamic quantization 后训练静态量化 Post
  • python中dataframe怎么去重_pandasdataframe重复数据查看.判断.去重

    Apple iPhone 11 A2223 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 gt 本文详解如何使用pandas查看dataframe的重复数据 判断是否重复 以及如何去重 dataframe数据样本
  • python数据容器--五类数据容器的总结对比

    python数据容器 五类数据容器的总结对比 列表 元组 字符串 集合 字典 下标索引 是 是 是 否 否 重复元素 是 是 是 否 否 是否可修改 是 否 否 是 是 适用场景 一批数据 可修改 可重复的存储场景 一批数据 不可修改 可重
  • 5 spring事件与监听器

    Spring的事件 1概述 ApplicationEvent以及Listener是Spring为我们提供的一个事件监听 订阅的实现 内部实现原理是观察者设计模式 设计初衷也是为了系统业务逻辑之间的解耦 提高可扩展性以及可维护性 2组成 Ap
  • android图片压缩上传

    一 调用webservice接口 传的参数是String类型的参数 需要把Bitmap转换为String类型 byte arrayOfByte CommUtil Bitmap2Bytes DangerPointSubmitActivity
  • 关于phpStudy的Less-26空格被过滤使用%a0变乱码无法执行应该带有空格的查询语句

    我的实验环境是 C phpStudy PHPTutorial WWW sqli labs master Less 26 练习sql inject 注入练习第26关 Less 26 输入的空格被过滤了 提示中明显指出select 和 1之间的
  • 腾讯云:MySQL数据库的高可用性分析

    作者介绍 易固武 腾讯高级工程师 参与腾讯账号安全建设 腾讯数据仓库 TDW 优化改造 腾讯云数据库等项目 对大规模分布式存储和计算系统有浓厚的兴趣和经历 MySQL数据库是目前开源应用最大的关系型数据库 有海量的应用将数据存储在MySQL
  • git pull出现Abort没有原因提示

    使用git pull更新时 出现文件冲突 将冲突文件解决后 再进行pull操作 出现abort 但是没有提示原因 这是由于直接在子文件夹下进行pull操作 而其他级别的文件夹下出现也出现文件冲突 而git发现了冲突但是由于不在当前目录下没有
  • 教你一招:解决u盘插入计算机时提示格式化,如何恢复u盘中的文件

    1 插入U盘时 计算机提示格式化 看到这里 到底是格不格呢 别怕 随便你了 2 查看U盘属性 发现都为零 怎么办呢 u盘上面有很多重要文件啊 别急 继续往下看 3 解决办法 1 下载DiskGenius硬盘恢复软件 安装后打开 软件官方下载
  • 招聘数据采集+数据清洗与分析+数据可视化

    1 需求 1 1 数据采集 1 网站解析 利用 chrome 查看网页源码 分析招聘网站网页结构 1 检查 招聘网站 在网页中右键点击检查 或者 F12 快捷键 进入 如下图的查看元素页面 示例图 1 2 检查网站 点击 Network 勾
  • oracle 9i下在线重定义表

    9i提供了联机重定义表的方法 可以让你在基本不影响原表的DML情况下修改表结构 实际上 联机重定义表并不是完全的联机重定义 在最后交换表名的时候会短暂地锁定原表和中间表 但这个过程很短暂 相对于传统方法来说 这是一个进步 9i提供了联机重定
  • 三千书源——愿成为整理最全的书源合集

    引言 古有弱水三千 今有三千书源 勿埋我心 三千大世界 三千书之源 随着 三千书源 渐渐变得充足起来 感谢收藏 希望可以多来看望勿埋我心 注意 现在主流是3 0书源 欢迎在评论区投稿不错的书源 软件下载 3 0 推荐使用 酷安 Github
  • MTSC2020

    MTSC2020中国互联网测试开发大会深圳站 于 2020 年 11 月 20 日至 21 日在深圳宝立方国际酒店召开 为中国质量保证行业奉上一场为期 2 天的技术盛宴 500 来自世界各地的测试精英们汇聚一堂探讨交流 来自阿里巴巴淘系技术
  • CTF新手题

    CTF Capture The Flag 是一种网络安全技能竞赛 它涉及到多个领域 如密码学 逆向工程 漏洞利用 Web安全等 每个比赛都会有多个题目 每个题目都有一个旗帜 玩家需要通过解决问题 攻击漏洞或破解密码等手段 获取旗帜并提交给比
  • MySQL最全面的优化技巧

    如果面试官问你 你会从哪些维度进行 MySQL 性能优化 你会怎么回答 所谓的性能优化 一般针对的是MySQL查询的优化 既然是优化查询 我们自然要先知道查询操作要经过哪些环节 然后思考可以在哪些环节进行优化 查询操作需要经历的基本环节 S
  • FBX SDK快速简笔(基本)

    FBX SDK快速简笔 摘至官方文档 因不开源 大部分地方官方文档中存在保密 以个人理解进行了一部分的推导 该文章免费并承诺不涉及如何利益 FBX模型的组织结构 FBX是以scene graph的结构来存储模型的所有信息 也可以认为是一个多
  • Weka内置特征选择算法整理

    属性评估方法 CfsSubsetEval 根据属性子集中每一个特征的预测能力以及它们之间的关联性进行评估 ChiSquaredAttributeEval 根据与分类有关的每一个属性的卡方值进行评估 ClassifierSubsetEval
  • Vue基础精讲 —— 详解Vue实例、Vue实例的属性和方法

    Vue实例 基本配置 在 build文件夹 下新建 webpack config practice js 配置文件 内容参考 const path require path const HTMLPlugin require html web