Vue全局

Vue.extend(options)

  • 以下内容参考与Vue的官方文档。

  • Vue构造器,创建一个’子类’。参数是一个包含组件的对象。

  • data必须是一个函数,通过处理和返回值确定参数的值。如果不是函数,那么在复用组件的时候,会因为数据唯一使得更改同一个组件时会影响到其他的组件里的数据,各有用法差异;

<div id="mount-point"></div>
// 创建构造器
var Profile = Vue.extend({
  template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
  data: function () {
    return {
      firstName: 'Walter',
      lastName: 'White',
      alias: 'Heisenberg'
    }
  }
})
// 创建 Profile 实例,并挂载到一个元素上。
new Profile().$mount('#mount-point');
<p>Walter White aka Heisenberg</p>

Vue.nextTick([callback,context])

  • 在文档整体循环更新结束后延迟回调 ,在修改数据之后立即使用这个方法,获得更新后的DOM。
// 修改数据
vm.msg = 'Hello'
// DOM 还没有更新
Vue.nextTick(function () {
  // DOM 更新了
})

// 作为一个 Promise 使用 (2.1.0 起新增,详见接下来的提示)
Vue.nextTick()
  .then(function () {
    // DOM 更新了
  })

2.1.0 起新增:如果没有提供回调且在支持 Promise 的环境中,则返回一个 Promise。请注意 Vue 不自带 Promise 的 polyfill,所以如果你的目标浏览器不原生支持 Promise (IE:你们都看我干嘛),你得自己提供 polyfill。

Vue.set(target,key,value)

  • 向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新属性,因为 Vue 无法探测普通的新增属性 (比如 this.myObject.newProperty = 'hi')

注意对象不能使Vue的实例,也不能是Vue的data根对象

//错误写法
const app = new Vue({
  data: {
    a: 1
  }
  // render: h => h(Suduko)
}).$mount('#app1')

Vue.set(app.data, 'b', 2)

//正确写法
var app10 = new Vue({
    el:"#app-10",
    data:{
        msg:{
            age:18
        }
    }
})
Vue.set(app10.msg,"name","zhangsan");

Vue.delete(target,key)

  • 删除对象的属性。如果对象是响应式的,确保删除能触发更新视图。要求和set类似。

Vue.directive(id,[definition])

  • 注册获取全局指令。

// 注册
Vue.directive('my-directive', {
  bind: function () {},
  inserted: function () {},
  update: function () {},
  componentUpdated: function () {},
  unbind: function () {}
})

// 注册 (指令函数)
Vue.directive('my-directive', function () {
  // 这里将会被 `bind` 和 `update` 调用
})

// getter,返回已注册的指令
var myDirective = Vue.directive('my-directive')

比如我们自定义一个百度搜索引擎的打开自动聚焦的功能

  • 当页面加载完成时,页面的input会主动聚焦,提升交互友好度。
// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

<input v-focus/>

钩子函数

一个指令定义对象可以提供如下几个钩子函数 (均为可选):

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。

  • update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。

  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

  • unbind:只调用一次,指令与元素解绑时调用。

钩子函数的参数

  • 指令钩子函数会被传入一下参数:

    • el:指令所绑定的元素,可以用来直接操作 DOM 。
    • binding:一个对象,包含以下属性:
      • name:指令名,不包括 v- 前缀。
      • value:指令的绑定值,例如:v-my-directive=“1 + 1” 中,绑定值为 2。
      • oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
      • expression:字符串形式的指令表达式。例如 v-my-directive=“1 + 1” 中,表达式为 “1 + 1”。
      • arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 “foo”。
      • modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
      • vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
      • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
  • 注意除了el外,其他参数都是只读的,不要对齐进行修改。

官方文档的一个例子


<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>

Vue.directive('demo', {
  bind: function (el, binding, vnode) {
    var s = JSON.stringify
    el.innerHTML =
      'name: '       + s(binding.name) + '<br>' +
      'value: '      + s(binding.value) + '<br>' +
      'expression: ' + s(binding.expression) + '<br>' +
      'argument: '   + s(binding.arg) + '<br>' +
      'modifiers: '  + s(binding.modifiers) + '<br>' +
      'vnode keys: ' + Object.keys(vnode).join(', ')
  }
})

new Vue({
  el: '#hook-arguments-example',
  data: {
    message: 'hello!'
  }
})

输出结果:

name: "demo"
value: "hello!"
expression: "message"
argument: "foo"
modifiers: {"a":true,"b":true}
vnode keys: tag, data, children, text, elm, ns, context, fnContext, fnOptions, fnScopeId, key, componentOptions, componentInstance, parent, raw, isStatic, isRootInsert, isComment, isCloned, isOnce, asyncFactory, asyncMeta, isAsyncPlaceholder
  • 如果你只需要触发bind和update并触发同一个行为,那么可以这样写:
Vue.directive('color-swatch', function (el, binding) {
  el.style.backgroundColor = binding.value
})
  • 就想这样使用:
<div v-demo="{ color: 'white', text: 'hello!' }"></div>
Vue.directive('demo', function (el, binding) {
  console.log(binding.value.color) // => "white"
  console.log(binding.value.text)  // => "hello!"
})
<think>好的,用户想了解Vue全局样式,我需要详细解释清楚。首先得明确全局样式的定义,它是指在整个Vue应用中生效的CSS样式,不需要在每个组件中重复引入。 接下来,我应该分几种常见的方法来介绍。首先是主CSS文件,通常在main.js或App.vue中引入,这样所有的组件都会继承这些样式。需要举例说明,比如在main.js里import './assets/global.css',这样用户能明白具体操作步骤。 然后是全局样式表的使用场景,比如重置浏览器默认样式、定义公共变量等。这部分要让用户知道为什么要用全局样式,解决什么问题。比如用Normalize.css或者自定义的基础样式,确保不同浏览器显示一致。 接下来是使用CSS预处理器的情况,比如Sass/SCSS、Less等。需要说明如何在项目中安装对应的loader,比如sass-loader,然后在vue.config.js里配置全局变量和混入。这样用户如果使用预处理器,可以更方便地管理全局样式。 还有全局样式与组件样式的优先级问题,需要提醒用户注意CSS的作用域。Vue的单文件组件默认有scoped属性,样式不会影响全局,但全局样式可能被组件内的样式覆盖。这时候可能需要用深度选择器,比如::v-deep,来修改子组件样式,但要注意使用场景和规范。 另外,可能用户在使用UI框架时遇到样式覆盖问题,比如Element UI或Vant,这时候需要全局修改主题色或组件样式。可以举例说明如何通过覆盖CSS变量或使用全局样式调整。 还要提到在Vue 3中使用CSS Modules或者组合式API时的注意事项,虽然这可能稍微高级一点,但提前说明有助于用户扩展知识。 需要检查是否有遗漏的方法,比如通过@import在App.vue的style中引入全局样式,或者在index.html中直接添加link标签。不过通常推荐在main.js引入,或者使用构建工具的配置来处理。 最后总结一下,全局样式的管理需要根据项目需求选择合适的方式,同时注意样式的组织和维护,避免冲突。可能用户的实际问题是如何统一风格或覆盖第三方库样式,所以给出具体例子会更有帮助。 还要确保语言口语化,避免使用专业术语过多,必要时举例说明,让不同水平的用户都能理解。结构要清晰,分点列出,方便阅读。同时,提醒用户注意样式优先级和最佳实践,避免常见错误。</think>在Vue项目中,全局样式是指应用于整个应用程序的CSS样式规则。以下是关于Vue全局样式的逐步说明: ### 一、创建全局样式的常见方式 1. **主CSS文件引入** - 在`src/assets`目录下创建`global.css`文件 - 在入口文件`main.js`中全局引入: ```javascript import './assets/global.css' ``` - 或在根组件`App.vue`的`<style>`标签中引入: ```css @import url('./assets/global.css'); ``` 2. **使用CSS预处理器(推荐)** ```bash # 安装Sass支持 npm install sass sass-loader -D ``` ```scss /* src/styles/global.scss */ :root { --primary-color: #42b983; } ``` 3. **通过vue.config.js配置全局样式** ```javascript // vue.config.js module.exports = { css: { loaderOptions: { sass: { additionalData: `@import "@/styles/global.scss";` } } } } ``` ### 二、典型使用场景 1. **基础样式重置** ```css /* 重置浏览器默认样式 */ * { margin: 0; padding: 0; box-sizing: border-box; } ``` 2. **定义公共变量** ```scss /* 颜色变量 */ $primary-color: #1890ff; $error-color: #ff4d4f; ``` 3. **全局动画定义** ```css @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } ``` ### 三、样式优先级说明 1. **组件内样式** > **全局样式** ```vue <!-- 组件中 --> <style scoped> .text { color: red; /* 将覆盖全局的同名样式 */ } </style> ``` 2. **穿透作用域(慎用)** ```css /* 使用深度选择器修改子组件样式 */ ::v-deep(.child-component) { padding: 10px; } ``` ### 四、最佳实践建议 1. **样式组织规范** ``` src/ ├─ styles/ │ ├─ base/ # 基础样式 │ ├─ components/ # 组件相关 │ ├─ utils/ # 工具类 │ └─ variables.scss # 变量定义 ``` 2. **按需加载策略** ```javascript // 通过Webpack动态加载 import(/* webpackPrefetch: true */ './styles/theme/dark.css') ``` 3. **第三方库样式覆盖** ```css /* 修改Element Plus主题色 */ :root { --el-color-primary: #42b983; } ``` ### 五、常见问题处理 1. **样式不生效检查** - 检查文件引入路径是否正确 - 确认样式未被`scoped`限制 - 检查选择器优先级 2. **响应式布局方案** ```scss // 全局响应式断点 $breakpoint-mobile: 768px; @mixin mobile { @media (max-width: #{$breakpoint-mobile}) { @content; } } ``` 通过合理配置全局样式,可以实现统一的视觉规范,提升代码复用性。建议将基础样式、变量定义等通用内容放在全局样式中,组件特定样式使用`scoped`局部作用域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的飞牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值