Vue之处理边界情况

简介: 处理边界情况All the features on this page document the handling of edge cases,meaning unusual situations that sometimes require bending Vue’s rules a little. Note however, that they all have disadvantages or situations where they could be dangerous.特殊情况下的处理方式,有利有弊

Vue之处理边界情况



处理边界情况


All the features on this page document the handling of edge cases,meaning unusual situations that sometimes require bending Vue’s rules a little. Note however, that they all have disadvantages or situations where they could be dangerous.


特殊情况下的处理方式,有利有弊


1. 访问元素&组件


1.1 访问根实例(Accessing the Root Instance )


通过 this.$root 根实例


// The root Vue instance
new Vue({
  data: {
    foo: 1
  },
  created:function(){
    // 【获取根组件的数据】
    console.log(this.$root.foo); 
    // 【写入根组件的数据】
    this.$root.foo = 2
    // 【访问根组件的计算属性】
    this.$root.bar;
  },
  computed: {
    bar: function () {
      alert('我是计算属性bar,只要有人访问我或者改变我的值,我就执行')
    }
  },
  methods: {
    baz: function () {
      alert('baz')
    }
  }
})


这种适合小型代码量时使用,中大型项目还是推荐用 Vuex来管理应用的状态:如下

用根实例获取状态 VSVuex管理状态


aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvMTAzNTgyLzE1OTM1NjcxMDE1ODQtY2M5YjUwZmEtYTAzNC00YzQzLWIyNzktNjg5ZjVkNDM3YzZjLnBuZw.png


1.2 访问父组件实例


Similar to $root, the $parent property can be used to access the parent instance from a child.

This can be tempting to reach for as a lazy alternative to passing data with a prop.


父组件通过prop向子组件传值,子组件也可通过$parent访问父组件的值


1.3 访问子组件或子元素


通过$refs访问子组件,注意: $refs 只会在组件渲染完成之后生效。


<div id="app">
    <base-input ref="usernameInput"></base-input>
</div>
<script>
    Vue.component("base-input", {
        template: "<input type='input' ref='input'>",
        methods: {
            popUp() {
                alert(11)
            },
            focus: function () {
                this.$refs.input.focus()
            }
        }
    });
    new Vue({
        el: "#app",
        data: {},
        mounted: function () {
            this.$refs.usernameInput.popUp();
            this.$refs.usernameInput.focus();
        }
    });
</script>


1.4 依赖注入


In fact, you can think of dependency injection as sort of “long-range props”


使用props是父组件向子组件共享数据

而使用依赖注入是父组件向所有的子孙组件共享数据(可跨层级的分享数据)

使用方法:


// 父组件中抛出要分享的数据
provide: function () {
  return {
    getMap: this.getMap
  }
}
// 在子组件中注入一下就可以用了,so easy!
inject: ['getMap']


2. 程序化的事件监听(Programmatic Event Listeners )


Listen for an event with $on(eventName, eventHandler)

Listen for an event only once with $once(eventName, eventHandler)

Stop listening for an event with $off(eventName, eventHandler)

当你需要在一个组件实例上手动侦听事件时,它们是派得上用场的


<div id="app">
    <input ref="dateInput" v-model="date" type="text" />
</div>
<script>
    new Vue({
        el: "#app",
        data: {
            date: null
        },
        mounted: function() {
            var picker = new Pikaday({
                field: this.$refs.dateInput,
                format: "YYYY-MM-DD"
            });
            this.$once("hook:beforeDestroy", function() {
                picker.destroy();
            });
        }
    });
</script>


3. 循环引用


3.1 递归组件


Components can recursively invoke themselves in their own template. However, they can only do so with the name option


组件可以在自身模板中调用自己,注意:不要陷入无限循环


<div id="app">
    <base-input></base-input>
</div>
<script>
    Vue.component("base-input", {
        name: 'stack-overflow',
        template: '<div><stack-overflow></stack-overflow></div>'   // 无限循环:报错:Maximum call stack size exceeded
    });
    new Vue({
        el: "#app",
        data: {}
    });
</script>


3.2 组件之间的循环引用


常见场景:渲染多层级结构时会用到


4. 定义模板的另外两种方式


4.1 Inline Template


这种方式会放模板的作用域容易混淆,不推荐,还是推荐用组件中的 template 选项或者.vue文件中的元素


<my-component inline-template>
  <div>
    <p>These are compiled as the component's own template.</p>
    <p>Not parent's transclusion content.</p>
  </div>
</my-component>


4.2 X-Template


这个有点像mustuche模板的用法


<script type="text/x-template" id="hello-world-template">
  <p>Hello hello hello</p>
</script>
Vue.component('hello-world', {
  template: '#hello-world-template'
})


5. 控制更新(Controlling Updates)


5.1 强制更新


If you find yourself needing to force an update in Vue, in 99.99% of cases, you’ve made a mistake somewhere.


使用 $forceUpdate 强制更新,注意:需要强制更新的情况极少,99%可能性是你哪边出错了


5.2 通过 v-once 创建低开销的静态组件


要渲染的静态内容很多,明显影响了渲染性能时可以用,一般不要用。


Vue.component('terms-of-service', {
  template: `
    <div v-once>
      <h1>Terms of Service</h1>
      ... a lot of static content ...
    </div>
  `
})
目录
相关文章
|
17天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
3天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
4天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
4天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
4天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
3天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
5天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
3天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
5天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
10天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发