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>
  `
})
目录
相关文章
|
7天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
9天前
|
JavaScript
Vue 指令速查表
【10月更文挑战第12天】Vue 指令速查表
|
7天前
|
缓存 JavaScript 搜索推荐
Vue SSR(服务端渲染)预渲染的工作原理
【10月更文挑战第23天】Vue SSR 预渲染通过一系列复杂的步骤和机制,实现了在服务器端生成静态 HTML 页面的目标。它为提升 Vue 应用的性能、SEO 效果以及用户体验提供了有力的支持。随着技术的不断发展,Vue SSR 预渲染技术也将不断完善和创新,以适应不断变化的互联网环境和用户需求。
27 9
|
6天前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
5天前
|
JavaScript
如何在 Vue 中使用具名插槽
【10月更文挑战第25天】通过使用具名插槽,你可以更好地组织和定制组件的模板结构,使组件更具灵活性和可复用性。同时,具名插槽也有助于提高代码的可读性和可维护性。
13 2
|
5天前
|
JavaScript
Vue 中的插槽
【10月更文挑战第25天】插槽的使用可以大大提高组件的复用性和灵活性,使你能够根据具体需求在组件中插入不同的内容,同时保持组件的结构和样式的一致性。
11 2
|
5天前
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
6天前
|
JavaScript 前端开发 UED
vue 提高 tree shaking 的效果
【10月更文挑战第23天】提高 Vue 中 Tree shaking 的效果需要综合考虑多个因素,包括模块的导出和引用方式、打包工具配置、代码结构等。通过不断地优化和调整,可以最大限度地发挥 Tree shaking 的优势,为 Vue 项目带来更好的性能和用户体验。
|
10天前
|
JavaScript 前端开发 开发者
Vue 的优缺点
【10月更文挑战第16天】Vue 具有众多优点,使其成为前端开发中备受青睐的框架之一。尽管它也存在一些局限性,但通过合理的应用和技术选型,这些问题可以得到一定程度的解决。在实际项目中,开发者可以根据项目的需求和特点,权衡 Vue 的优缺点,选择最适合的技术方案。同时,随着 Vue 不断的发展和完善,相信它将在前端开发领域继续发挥重要作用。
18 6
|
10天前
|
JavaScript 前端开发 编译器
在 Vue 项目中使用 ES 模块格式的优点
【10月更文挑战第20天】在 Vue 项目中使用 ES 模块格式具有众多优点,这些优点共同作用,使得项目能够更高效、更可靠地开发和运行。当然,在实际应用中,还需要根据项目的具体情况和需求进行合理的选择和配置。
20 6