初学Vue(全家桶)-第n天(vue2):关于v-bind=“$attrs“、v-bind=“$props“ 和v-on=“$listeners“的使用

这篇具有很好参考价值的文章主要介绍了初学Vue(全家桶)-第n天(vue2):关于v-bind=“$attrs“、v-bind=“$props“ 和v-on=“$listeners“的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

初学vue

简介

1、v-bind="$props": 可以将父组件的所有props下发给它的子组件,子组件需要在其props:{} 中定义要接受的props。

2、v-bind="$attrs": 将调用组件时的组件标签上绑定的非props的属性(class和style除外)向下传递。在子组件中应当添加inheritAttrs: false(避免父作用域的不被认作props的特性绑定应用在子组件的根元素上)。

3、v-on="$listeners":通过this.emit(‘事件名’,数据),将底层级的信息往高层级传递。

1、v-bind=“$props”

有如下层级关系:
父组件TheOuter想向子组件TheInner传值

<App>
	<TheOuter> 
		<TheMiddle> 
			<TheInner>
			</TheInner>
		</TheMiddle>
	</TheOuter>
</App>
  • App.vue
<template>
  <div id="app">
  	<!--往下传值-->
    <TheOuter :id="1" :name="'jack'" :age="21"></TheOuter>
  </div>
</template>

<script>
import TheOuter from "./components/TheOuter.vue";

export default {
  name: "App",
  components: {
    TheOuter,
  },
};
</script>
  • TheOuter.vue
<template>
  <div>
  	<!--继续往下传值-->
    <!--<TheMiddle :id="id" :name="'name'" :age="age"></TheMiddle>--> <!-- 不使用v-bind="$props"时这么传值 -->
    <TheMiddle v-bind="$props" gender="man"></TheMiddle>
  </div>
</template>

<script>
import TheMiddle from "./TheMiddle.vue";
export default {
  name: "TheOuter",
  components: { TheMiddle },
  props:['id','name','age'], // 接收prop值
  data() {
    return {};
  },
  mounted() {
    console.log(this.id, this.name, this.age,"这是TheOuter组件");
  },
};
</script>
  • TheMiddle.vue
<template>
  <div>
  	<!--继续往下传值-->
  	<!--<TheInner :id="id" :name="'name'" :age="age"></TheInner>--> <!-- 不使用v-bind="$props"时这么传值 -->
    <TheInner v-bind="$props"></TheInner>
  </div>
</template>

<script>
import TheInner from "./TheInner.vue";
export default {
  name: "TheMiddle",
  components: { TheInner },
  props:['id','name','age'], // 接收prop值
  data() {
    return {};
  },
  mounted(){
    console.log(this.id, this.name, this.age,"这是TheMiddle组件");
  }

};
</script>
  • TheInner.vue
<template>
  <div>
    <div>hello啊</div>
  </div>
</template>

<script>
export default {
  name: "TheInner",
  props: ["id", "name", "age"], // 接收prop值
  data() {
    return {};
  },
  mounted() {
    // console.log(this.$props["name"]);
    console.log(this.id, this.name, this.age, "这是TheInner组件");
  },
};
</script>

2、v-bind=“$attrs”

例如,有如下层级关系:
父组件TheOuter想向子组件TheInner传值

<App>
	<TheOuter> 
		<TheMiddle> 
			<TheInner>
			</TheInner>
		</TheMiddle>
	</TheOuter>
</App>
  • App.vue
<template>
  <div id="app">
    <TheOuter id="1" name="jack" age="21"></TheOuter>
  </div>
</template>
  • TheOuter.vue
<template>
  <div>
    <TheMiddle v-bind="$attrs" gender="man"></TheMiddle>
  </div>
</template>

// ----------------------------------
mounted(){
  // console.log(this.$attrs['id']); // 1
  // console.log(this.$attrs['name']); // jack
  // console.log(this.$attrs['age']); // 21
}
  • TheMiddle.vue
<template>
  <div>
    <TheInner v-bind="$attrs"></TheInner>
  </div>
</template>

// ----------------------------------
mounted(){
  // prop中变量的使用
  // console.log(this.$attrs['id']); // 1
  // console.log(this.$attrs['name']); // jack
  // console.log(this.$attrs['age']); // 21
  // console.log(this.$attrs['gender']); // man
}
  • TheInner.vue
<template>
  <div>
    <div>hello啊</div>
  </div>
</template>

// ----------------------------------
mounted(){
  // prop中变量的使用
  // console.log(this.$attrs['id']); // 1
  // console.log(this.$attrs['name']); // jack
  // console.log(this.$attrs['age']); // 21
  // console.log(this.$attrs['gender']); // man
}

v-bind="$attrs"的作用是将调用组件时的组件标签上绑定的非props的属性(class和style除外)向下传递
你可以发现,使用了v-bind='$attrs'的组件,都可以使用从上级组件中获取值,并且它的下级组件直接下级组件即便没有用v-bind='$attrs'绑定,同样也可以获取到值。

需要注意的是,可以用props来接收传递过来的值,但不要同时用props配置项和this.\$props['xxx']调用同一个值,因为props优先级比this.$props['xxx']高,会导致this.$props['xxx']的结果为undefined。

3、v-on=“$listeners”

和上面的this.$ attrs['xxx']相反,v-on="$listeners"作用是用于底层级组件向高层级组件传递信息。通过this.$emit()触发事件,来进行信息传递,

例如有父组件TheOuter,子组件TheMiddle孙组件TheInner 三个组件,如果TheInner传递信息给TheMiddle则可直接使用$emit,如果是TheInner向TheOuter传递信息,则就需要TheInner先$emit给TheMiddle,TheMiddle再$emit给TheOuter,这种方式比较繁琐,则此时可以使用v-on="$listeners"来满足当前需求。

具体使用

层级关系如下:文章来源地址https://www.toymoban.com/news/detail-766805.html

<App>
	<TheOuter> 
		<TheMiddle> 
			<TheInner>
			</TheInner>
		</TheMiddle>
	</TheOuter>
</App>
  • App.vue
<template>
  <div id="app">
    <TheOuter></TheOuter>
  </div>
</template>
  • TheOuter.vue
<template>
  <div>
    <!-- $emit触发sendMsg事件,sendMsg事件执行sendMsg()方法,输出从底层接收到的值 -->
    <TheMiddle @sendMsg='sendMsg'></TheMiddle>
  </div>
</template>

// --------------------------------------
  methods:{
    sendMsg(msg){
      console.log("收到信息了,这里是TheOuter.vue组件",msg);
    }
  }
  • TheMiddle.vue
<template>
  <div>
    <!-- 通过v-on=$listeners 将要触发的事件和数据往上层传递-->
    <TheInner v-on="$listeners"></TheInner>
  </div>
</template>

// 同样这里也可以调用
mounted(){
	this.$listeners.sendMsg()
}
  • TheInner.vue
<template>
  <div>
    <button @click="handleClick">hello啊</button>
  </div>
</template>

// -----------------------------------
  methods:{
  	// 点击事件触发的函数
    handleClick(){
      // 调用this.$emit,往上层传递要触发的事件名和数据
      this.$emit("sendMsg",'hello啊')
      // 或者
      // this.$listeners.sendMsg('hello啊')
    }
  }

// ------------------------------------
// 或者更简单点写,直接不写方法了
<template>
  <div>
    <button @click="$emit('sendMsg','hello啊')">hello啊</button>
  </div>
</template>

到了这里,关于初学Vue(全家桶)-第n天(vue2):关于v-bind=“$attrs“、v-bind=“$props“ 和v-on=“$listeners“的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Vue] CSS中的v-bind

    在 Vue 中说到 v-bind 大多数时候都是想到 template 中动态绑定 script 中的响应式数据。 但其实在单文件组件(SFC)中, style 标签内也可以使用 v-bind 函数绑定数据。 如上图第18行代码,使用 v-bind(color) 绑定了数据。 当数据变化时,css样式随之变化: 原理 :(截取自Vue官方文档)

    2024年02月19日
    浏览(35)
  • 五、vue基础-指令之v-bind

    前面要讲的一系列指令,主要是将值插入到 模板内容 中。  但是,除了内容需要动态来决定外,某些 属性 我们也希望动态来绑定。 比如动态绑定a元素的href属性; 比如动态绑定img元素的src属性; 绑定属性我们使用v-bind: 缩写:冒号(:) 预期:any(with argument) | Object(without

    2024年02月08日
    浏览(45)
  • vue 简单实验 v-bind 变量与html属性绑定

    1.代码 2.运行结果  

    2024年02月11日
    浏览(39)
  • vue中v-bind和v-model的区别

    v-bind 和 v-model 是Vue.js中的两个常用指令,它们在功能和用途上有一些区别。 v-bind 指令(或简写为 : )用于动态 绑定数据到HTML属性 (不是双向的)。它允许您将Vue实例的数据绑定到HTML元素的属性上,并根据数据的变化动态更新属性的值。可以使用 v-bind 指令来实现属性的动态

    2024年02月13日
    浏览(37)
  • vue3中常用的指令之v-bind和v-on

    一个vue2和vue3之间的不同之处:Vue2中template模板中只能有一个根元素,但是在Vue3中允许template中有多个元素。 1.v-bind的绑定基本属性 某些属性也希望是动态绑定的,比如动态绑定a元素中的href属性。 v-bind可以绑定一个或者多个属性值,或者向另一个组件中传递props值。 v-bind

    2024年02月16日
    浏览(43)
  • vue 报错:Elements in iteration expect to have ‘v-bind:key‘ directives.eslint-plugin-vue

    原因: 在用vscode 编写vue 代码时,因为安装的有vetur 插件,所以当代码中有v-for 语法时,会提示,“Elements in iteration expect to have ‘v-bind:key’ directives.eslint-plugin-vue” 这个错误。这是eslint 的功能,对vue 进行了eslint 检查。 解决: 第一种方法,添加 :key 属性 在v-for 指令后加上

    2024年02月05日
    浏览(43)
  • Vue全家桶系~1.Vue2基础(兼容)

    HTML+CSS+JS基础文档:https://developer.mozilla.org/zh-CN/docs/Web Vue3官网文档:https://cn.vuejs.org/ | Vue2文档:https://v2.cn.vuejs.org/v2/guide 个人建议:对于小白和新手,以及只会HTML+CSS+JS基础的人来说,别上来就搞那一套高度封装的开发方式,开发是很方便,调bug也是非常麻烦的。先以这种脚

    2024年02月13日
    浏览(37)
  • vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model

    目录 setup函数 props参数 案例 第一种写法(用setup函数的方式):  第二种方法(语法糖形式即setup写入script标签中)也可以传值,  context (attrs,emit,slots) vue3中的双向数据绑定自定义事件emit和v-model emit自定义事件 v-model 有两个参数分别是 props,context 即 props参数是一个 对象 ,

    2024年02月10日
    浏览(43)
  • Vue2 watch监听props的值

    再次遇到监听子组件收到父组件传过来的值,如果这个值变化,页面中的值发现是不会跟着同步变化的。所以监听props中的值,一直监听。   代码:  

    2024年02月13日
    浏览(44)
  • Vue运行报错:Custom elements in iteration require ‘v-bind:key‘ directives.eslintvue/valid-v-for

    在使用vue-cli工具进行开发时,使用v-for出现如下报错: vue规定使用v-for条件渲染时,必须设置一个key,修改如下图(添加 :key=\\\"key\\\" ):

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包