【Vue】 组件封装

news2024/11/19 8:32:58

目录

  • 1 组件封装
    • 1.1 全局注册
    • 1.2 局部注册
      • 1.2.1 命名
      • 1.2.2 引用组件
        • 1.2.2.1 传统写法
        • 1.2.2.2 setup
        • 1.2.2.3 easycom
    • 1.3 父子组件间的数据传递
      • 1.3.1 子组件 data() 中设置数据
      • 1.3.2 父组件通过 prop 将数据传递给子组件
      • 1.3.3 子组件不能直接修改 prop 中的值
      • 1.3.4 子组件通过 emit 事件将子组件数据传递给父组件
      • 1.3.5 父组件通过 prop 把改变的值传到子组件中
    • 1.3 父子组件双向数据绑定
      • 1.3.1 v-model

1 组件封装

vue 官网 组件基础

  • 需要封装的情况
    • 组件复用
    • 模块化
  • 另: 修改子组件时,有时需重新运行才有效果

1.1 全局注册

<fzzz></fzzz>;

import yyy from "./components/xxx.vue";
Vue.component("zzz", yyy);
  • yyy 不能有 -
  • fzzz 只与 zzz 有关
// main.js
import inputSearch from "./components/inputSearch.vue";

Vue.component("inputSearch", inputSearch); // 3 种, i 开头
Vue.component("input-search", inputSearch); // <input-search></input-search>
Vue.component("input-Search", inputSearch); // <input-Search></input-Search>

Vue.component("InputSearch", inputSearch); // 6 种
Vue.component("Input-search", inputSearch); // <Input-search></Input-search>
Vue.component("Input-Search", inputSearch); // <Input-Search></Input-Search>
// main.js
import InputSearch from "./components/inputSearch.vue";

Vue.component("inputSearch", InputSearch); // 3 种, i 开头
Vue.component("input-search", InputSearch); // <input-search></input-search>
Vue.component("input-Search", InputSearch); // <input-Search></input-Search>

Vue.component("InputSearch", InputSearch); // 6 种
Vue.component("Input-search", InputSearch); // <Input-search></Input-search>
Vue.component("Input-Search", InputSearch); // <Input-Search></Input-Search>

1.2 局部注册

1.2.1 命名

建议使用大驼峰,因为这提高了模板的可读性,能帮助我们区分 Vue 组件和原生 HTML 元素。

<fyyy></fyyy>;

import yyy from "@/components/xxx.vue";
components: {
  yyy;
}
  • yyy 不能有 -
  • fyyy 只与 components:{} 的 yyy 有关
<inputSearch></inputSearch>
<input-search></input-search>
<input-Search></input-Search>

import inputSearch from "@/components/inputSearch.vue"
import inputSearch from "@/components/input-search.vue"
import inputSearch from "@/components/input-Search.vue"

import inputSearch from "@/components/InputSearch.vue"
import inputSearch from "@/components/Input-search.vue"
import inputSearch from "@/components/Input-Search.vue"

components: { inputSearch }
<InputSearch></InputSearch>
<Input-search></Input-search>
<Input-Search></Input-Search>

<inputSearch></inputSearch>
<input-search></input-search>
<input-Search></input-Search>

import InputSearch from "@/components/inputSearch.vue"
import InputSearch from "@/components/input-search.vue"
import InputSearch from "@/components/input-Search.vue"

import InputSearch from "@/components/InputSearch.vue"
import InputSearch from "@/components/Input-search.vue"
import InputSearch from "@/components/Input-Search.vue"

components: { InputSearch }

1.2.2 引用组件

uniapp 官网 引用组件

1.2.2.1 传统写法

  • child.vue
  • 导入 : import child from '@/components/child.vue';
  • 局部注册 : components: { child },
  • 使用 : <child></child>

在这里插入图片描述

1.2.2.2 setup

  • child.vue
  • <script setup></script>
  • 导入 : import child from '@/components/child.vue';
  • 使用 : <child></child>

在这里插入图片描述

1.2.2.3 easycom

  • child.vue 组件放在项目的 components 文件夹下,符合 components/组件名称/组件名称.vue 的目录结构,可直接引用
  • 使用 : <child></child>

在这里插入图片描述

1.3 父子组件间的数据传递

  • 父组件通过 prop 将数据传递给子组件
  • 子组件通过 emit 事件将子组件数据传递给父组件
  • 子组件不能直接修改 prop 中传给父组件的值

1.3.1 子组件 data() 中设置数据

// 子组件
<view>{{ name }}</view>

// data()
data() {
	return {
		name: 'xxx'
	}
},
// 父组件
<child></child>

1.3.2 父组件通过 prop 将数据传递给子组件

// 子组件
<view>{{ name }}</view>

// props
props: {
	name: {
		type: String,
		default: ''
	},
},
// 父组件
<child name="xxx"></child>

1.3.3 子组件不能直接修改 prop 中的值

// 子组件
<view @click="getValue">{{ name }}</view>

// props
props: {
	name: {
		type: String,
		default: ''
	},
},
methods:{
	getValue() {
		this.name = "yyy";  // 报错
	}
}
// 父组件
<child name="xxx"></child>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PePniYhx-1662716305299)(app_files/2.jpg)]

1.3.4 子组件通过 emit 事件将子组件数据传递给父组件

  • this.$emit(“fun1”, param); //其中 fun1 为父组件定义函数,param 为需要传递参数
// 子组件
<view @click="getValue">{{ name }}</view>

// data()、methods
data() {
	return {
		name: 'xxx'
	}
},
methods: {
	getValue() {
		this.$emit('change', this.name)
	}
}
// 父组件
<child @change="getName"></child>

// methods
methods: {
	getName(value) {
		console.log(value);
	}
}

1.3.5 父组件通过 prop 把改变的值传到子组件中

// 子组件
<view @click="getValue">{{ name }}</view>

//
props: {
	undataName: {
		type: String,
		default: ''
	},
},
data() {
	return {
		name: ''
	}
},
methods: {
	getValue() {
		this.$emit('change', this.name)
		this.name = this.undataName;
	}
}
// 父组件
<child @change="getName" undataName="yyy"></child>

// methods
methods: {
	getName(value) {
		console.log(value);
	}
}

1.3 父子组件双向数据绑定

1.3.1 v-model

Vue 父子组件如何双向绑定传值
Vue 官网 表单输入绑定

<input v-model="text"> 相当于
<input :value="text" @input="event => text = event.target.value">

  • 父组件使用子组件时,直接用 v-model 双向绑定 <child v-model="name"></child>
<!-- 子组件 -->
<template>
  <input :value="name" @input="onInput" />
</template>

<script>
  export default {
    model: {
      prop: "name", //这个字段,是指父组件设置 v-model 时,将变量值传给子组件的 name
      event: "getName", //这个字段,是指父组件监听 getName 事件
    },
    props: {
      name: {
        type: String,
        default: "",
      },
    },
    methods: {
      onInput(e) {
        this.$emit("getName", e.target.value);
        console.log(e.target.value);
      },
    },
  };
</script>
// 父组件
<template>
  <view>
    <child v-model="name"></child>
  </view>
</template>

<script>
  import child from "@/components/child.vue";
  export default {
    components: {
      child,
    },
    data() {
      return {
        name: "xxx",
      };
    },
    watch: {
      name(value) {
        console.log(value, "--value");
      },
    },
  };
</script>





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pinia中action使用详解

actions的使用 动作相当于组件中的方法。它们可以使用actionsin 属性进行定义。 并且在pinia中的action既可以有同步函数也可以有异步函数。 在actions中可以通过this访问该仓库所有实例 export const useUsers defineStore(users,{state:()>{userData:null},actions:{a…

【SpringMVC】集成Web、MVC执行流程、数据响应、数据交互

文章目录前言一.Spring集成Web二.对于SpringMVC的理解三.MVC执行流程&#xff08;&#x1f3f3;️‍&#x1f308;&#xff09;1.组件解析2.RequestMapping四.SpringMVC数据响应页面跳转回写数据五.SpringMVC获得请求数据前言 SpringMVC确实很麻烦&#xff0c;零碎的点太多 一…

小程序自定义tabbar导航栏、动态控制tabbar功能实现(uniapp)

uniapp开发小程序&#xff0c;不同角色/已登录未登录&#xff0c;都有不一样的底部导航栏&#xff0c;这些情况下就需要自行定义tabbar&#xff0c;从而实现动态tabbar的实现。 1.首先我们需要在pages.json配置tabbar 我这里并没有开启custom(自定义)&#xff0c;不开启的话&a…

vue实现思维导图

介绍 前景&#xff1a; 仿幕布实现思维导图效果 技术实现&#xff1a;jsmind 完整代码&#xff1a;vue-jsmind 参考文章&#xff1a; 在vue中使用jsmind组织架构或思维导图 实现效果&#xff1a; 功能描述&#xff1a; 编辑、删除、插入、拖拽、展开/收起节点分布结构切换…

数字IC前端面试问题总结

本篇主要参考了 1、新芯设计(3条消息) 新芯设计的博客_CSDN博客-如何成为一名高级数字 IC 设计工程师,数字 IC 技能拓展,基于 SoC 的卷积神经网络车牌识别系统设计领域博主 2、小汪的IC自习室 (3条消息) 小汪的IC自习室的博客_CSDN博客-数字IC设计,SystemVerilog & I…

前端使用xlsx插件读取excel文件数据(保姆级教程)

本人属于一个实习菜鸟&#xff0c;大神请谨慎阅读............ 在开发过程中&#xff0c;难免会碰到用前端来处理excel文件的需求&#xff0c;我们需要解析出excel文件的内容然后在以对象的形式展示或者与后端对接 功能的实现思路&#xff1a; 文件选择 > FileReader对象…

微信小程序中使用vant框架,方法步骤清晰,简单适用

1.说到vant框架相信大家应该并不陌生了吧&#xff0c;做过移动端开发的小伙伴们应该都知道它吧。 2.Vant 是有赞前端团队开源的移动端组件库&#xff0c;于 2017 年开源&#xff0c;已持续维护 4 年时间。Vant 对内承载了有赞所有核心业务&#xff0c;对外服务十多万开发者&am…

Vue 权限菜单(动态路由)详解

今天记录一下Vue的权限菜单&#xff08;动态路由&#xff09;&#xff0c;在我们写后台的时候用的比较多&#xff0c;Vue的权限菜单分两种&#xff0c;一种是通过本地进行&#xff0c;根据账号的权限进行筛选出可用的权限&#xff0c;组合菜单并在页面上渲染显示&#xff0c;另…

Vue3 从入门到放弃 (第一篇.环境准备)

什么是 Vue&#xff1f;# Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的…

uniapp-路由uni-simple-router

背景 专为uniapp打造的路由器&#xff0c;和uniapp深度集成通配小程序、App和H5端H5能完全使用vue-router开发模块化、查询、通配符、路由参数使 uni-app实现嵌套路由&#xff08;仅H5端完全使用vue-router&#xff09;uniapp用到了很多vue的api&#xff0c;但在路由管理的功能…

vue 上传文件和下载文件

vue 上传文件和下载文件1. 上传文件2. 下载文件1. 上传文件 上传文件我所使用的组件是element ui 的 el-upload&#xff0c;我一共进行了如下两步&#xff0c;第一步&#xff1a;修改样式&#xff0c;因为el-upload的样式不是我所要的&#xff0c;我想要这种的 代码如下 <…

【Vue 项目】使用 vuedraggable 实现拖拽效果时遇到的问题及解决方案总结(允许 el-table 行拖拽、部分元素不允许拖拽、拖拽避免影响文字复制和输入框输入文字)

由于在自己的工作和学习过程中&#xff0c;只查看某个大佬的教程或文章无法满足自己的学习需求和解决遇到的问题&#xff0c;所以自己在追赶大佬们步伐的基础上&#xff0c;又自己总结、整理、汇总了一些资料&#xff0c;方便自己理解和后续回顾&#xff0c;同时也希望给大家带…

【Node.js】深度解析常用核心模块-path模块

✅ 作者简介&#xff1a;一名将要迈入大三的大学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强…

本地存储(Local Storage) 和 会话存储(Session Storage)

我不会告诉你任何定义和概念&#xff0c;上车&#xff0c;读完这篇博客&#xff0c;你就会对本地存储(Local Storage) 和 会话存储(Session Storage)有一个清晰的认识。 目录前提知识范例示例1&#xff1a;将键值对提供给本地存储示例2: 本地存储中设置键值对示例3: 获取空值示…

浏览器链接跳转进入小程序指定页面(适用安卓和iOS)

安卓和ios 浏览器外部链接跳转进入小程序 需求&#xff1a;用户点击链接进入小程序 第一步&#xff1a; 需要后端配合调用微信官方提供的接口方法 生成小程序的链接。 官方文档如下&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-…

async与await异步编程

ECMA2017中新加入了两个关键字async与await 简单来说它们是基于promise之上的的语法糖&#xff0c;可以让异步操作更加地简单明了 首先我们需要用async关键字&#xff0c;将函数标记为异步函数 async function f() {} f()异步函数就是指&#xff1a;返回值为promise对象的函…

IDEA如何完美配置Servlet(适用于IDEA 2022及以下版本)

目录 准备Java文件 导入servlet-api.jar 配置Tomcat服务器 准备Java文件 1.首先新建Java项目 选择新建项目&#xff0c;构建系统选择Maven&#xff0c;点击创建 2.选择添加框架支持&#xff08;英文为Add Framework Support&#xff09; 3.选择添加web应用程序&#xff08;…

dom-to-image

前言 之前的文章&#xff1a;vue基于html2canvas和jspdf 生成pdf 、解决jspdf中文乱码问题 简单介绍了html2canvas的基本使用&#xff0c;html2canvas 只能截取可视区域&#xff0c;对于含有滚动条的无法完全截取。后来发现还有一个dom-to-image的库可以支持&#xff0c;并且能…

【C#+JavaScript+SQL Server】实现Web端考试系统 六:后台管理模块设计(附源码和资源)

需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一、后台管理模块概述 在线考试系统中&#xff0c;后台管理员模块具有最高权限&#xff0c;管理员通过登录模块成功登录之后&#xff0c;可以对试题信息&#xff0c;教师信息&#xff0c;考生信息&#xff0c;考试科目信息以…

CSS渐变背景看这一篇就够了

CSS渐变背景看这一篇就够了 在我们自己设计网页的时候&#xff0c;为了好看美观&#xff0c;颜色可谓是最让人头疼的一部分。尤其是在配色上又找不到一些好看的网站。今天我就来记录一些好看的渐变式背景&#xff0c;和一些常用的颜色网站。 CSS 渐变使可以显示两种或多种指定…