Vue2使用分享

132 阅读1分钟

一、子组件之间的通信

1.应用:页面中,不切换路由直接在子组件中切换

通过点击不同的导航,可以切换不同的组件,而且不用切换路由(全程都是一个路由地址)。而特点是调用者和被调用者共享一个父组件,换句话讲,这是子组件之间的通信。

图片.png 44f8a6b6404157ae9322cf0caba98f9.png

子组件(调用者,导航栏)👇

<template>  
  <div>
    <el-menu style="background-color: bisque;" :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect">
      <el-menu-item style="background-color: aqua;" index="1" @click="changePage('填入子组件名')">基本资料</el-menu-item>
      <el-menu-item style="background-color: blueviolet;" index="2" @click="changePage('填入子组件名')">修改头像</el-menu-item>
    </el-menu>
  </div>  
</template>  

<script>  
  export default {  
    methods: {  
      changePage(page) {
        this.$emit('page-change', page); // 触发子传父事件,通知父组件页面变化
      }
    }  
  }  

</script>

父组件:👇

<template>  
  <div>
     <SidebarMenu @page-change="handlePageChange"/>
  </div>
</template>  

<script>
  import sun1 from '~/components/SidebarMenu.vue';   //子组件1
  import sun2 from '~/components/Profile.vue';       //子组件2
  import sun3 from '~/components/Settings.vue';      //子组件3
  export default {
    components: {   //注册组件
      sun1,  
      sun2,  
      sun3
    },  
    data() {
      return {
        currentComponent: 'sun1'   //默认显示的子组件
      };  
    },  
    methods: {
      handlePageChange(page) {   //切换子组件组件
        this.currentComponent = page.charAt(0).toUpperCase() + page.slice(1); // 转换为组件名
      }  
    }
  } 
</script>

子组件(被调用者,用于展示信息):👇

<template>  
  <div>  
     <span>当前展示的是子组件1</span>
  </div>  
</template>

<script>
  export default {
    methods: {
      
      }  
    }
  } 
</script>

代码流程👇 c5d07c4181923f7e8b9f4433c2b2684.png

二、vue-router 对于管理系统的应用

1.路由配置部分:

顶级路由:制定哪个url展示哪个顶级视图(例如管理系统项目的背板)

一级路由:通常是视图,例如登录页、管理系统主页(包含导航栏等全局组件)

二级路由:局部组件,展示不同路由时可以切换的element-UI组件,在父组件(上级路由)中写作<router-view/>组件。

三、DOM操作

1.原生JavaScript环境与Vue环境下操作DOM的区别

JavaScript通过document.querySelectordocument.querySelector这些选择器来获取 DOM 元素;Vue 2通过 ref 属性引用 DOM 元素,避免直接操作全局 DOM

<!-- Vue 2通过`ref`属性引用 DOM 元素 -->

<template>
  <div>
    <p ref="myElement">原始文本</p>
    <button @click="updateText">更新文本</button>
  </div>
</template>

<script>
export default {
  methods: {
    updateText() {
      this.$refs.myElement.textContent = '更新后的文本';  // 通过this.$refs访问DOM元素
    }
  }
}
</script>

2.Vue2中DOM操作的生命周期

DOM 操作应在mounted 钩子或之后执行,确保 DOM 已渲染:

<!-- mounted之前无法执行dom操作 -->
<script>
export default {
  mounted() {   // 此时DOM已渲染完成,可以安全操作
    this.$refs.myElement.textContent = '初始化文本';
  }
}
</script>

3.访问子组件的DOM元素

父组件可通过访问子组件 DOM 来调用其方法访问数据

<!-- 在monted生命周期后访问其子组件的childMethod()方法 -->
<template>
  <ChildComponent ref="childRef" />
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  mounted() {
    // 访问子组件实例
    this.$refs.childRef.childMethod(); // 调用子组件方法
  }
}
</script>

以上这种组件间通信其实是属于子传父的场景,普通场景下更建议优先考虑使用 $emit 或 VueX这些更规范的方法 。

4.Vue2只能用ref属性访问DOM的场景

在 Vue 2 中,虽然推状态管理、指令来改变数据与交互逻辑,但在某些场景下仍需通过ref直接操作 DOM。以下是常见的必要场景

(1)必须直接操作 DOM 的第三方库:如 Chart.js、D3、地图库

(2)特殊的DOM API: Canvas、文件输入、媒体元素

(3)非 Vue 生态的插件:日期选择器、富文本编辑器

<!-- 示例:文件上传 -->
<template>
  <input type="file" ref="fileInput" @change="handleFile">
</template>

<script>
export default {
  methods: {
    handleFile() {
      const file = this.$refs.fileInput.files[0];
      // 处理文件...
    }
  }
}
</script>