Vueコンポーネント通信(6)


コンポーネント通信は、Vueの非常に一般的で重要な部分です。

1.親から子のコンポーネントへの通信

1.1小道具

小道具は最も一般的に使用される方法です。

// 父
<template>
	<child-component1 :name="name"></child-component1>
</template>

<script>
import ChildComponent1 from '@/components/ChildComponent1.vue'
export default {
    
    
  components: {
    
    
    ChildComponent1
  },
  data () {
    
    
    return {
    
    
      name: '小明'
    }
  },
}
</script>

// 子
<template>
	<div>姓名:{
    
    {
    
     name }}</div>
</template>

<script>
export default {
    
    
	props: {
    
    
	  name: {
    
    
	    type: String, // String、Number、Boolean、Array、Object、Date、Function、Symbol
	    default: '', // 默认值
	    required: true, // 定义该 prop 是否是必填项。如果为true未传值则会抛出警告
	    validator:Function, // 自定义验证参数,如果函数返回false则会抛出警告
	  }
	},
}
</script>

小道具の簡単な構文

props: ['name']

propsは文字列タイプのみを定義します

props: {
    
    
   name: String
}

パラメータがマルチタイプの場合は小道具

props: {
    
    
   name: ['String', 'Number']
}

1.2参照

この方法はめったに使用されません。

// 父
<template>
  <div class="page">
    <child-component1 :name="name" ref="cp"></child-component1>
  </div>
</template>

<script>

import ChildComponent1 from '@/components/ChildComponent1.vue'
export default {
    
    
  components: {
    
    
    ChildComponent1
  },
  data () {
    
    
    return {
    
    
      name: '小明'
    }
  },
  mounted () {
    
    
    this.$refs.cp.age = 18
  }
}
</script>

// 子
<template>
  <div class="container">
    <div>姓名:{
    
    {
    
     name }}</div>
    <div>年龄:{
    
    {
    
     age }}</div>
  </div>
</template>

<script>
export default {
    
    
  props: {
    
    
    name: {
    
    
      type: String,
      default: ''
    }
  },
  data () {
    
    
    return {
    
    
      age: 0
    }
  }
}
</script>

1.3人の子供

インスタンスは、親コンポーネントの子を介して取得されます。子は、親コンポーネント内の子コンポーネントのコレクションです。公式ドキュメントには、内部の順序は保証されていないと記載されています。

this.$children[0].age = 30

2.子は親コンポーネントと通信します

2.1放出

子コンポーネントを介してイベントをディスパッチし、親コンポーネントはイベントをリッスンして値を渡します。

// 父
<template>
  <div class="page">
    <child-component1 @onChildComponen="onChildComponen"></child-component1>
  </div>
</template>

<script>
import ChildComponent1 from '@/components/ChildComponent1.vue'
export default {
    
    
  components: {
    
    
    ChildComponent1
  },
  methods: {
    
    
    onChildComponen (data) {
    
    
      alert(data)
    }
  }
}
</script>

// 子
<template>
  <div class="container">
    <div @click="onClick">emit</div>
  </div>
</template>

<script>
export default {
    
    
  methods: {
    
    
    onClick () {
    
    
      this.$emit('onChildComponen', 1)
    }
  }
}
</script>

3サブコンポーネント通信

共通の親コンポーネントがあり、$ parent。$ emitを介してイベントをディスパッチし、$ parent。$ onを介してイベントをリッスンする必要があります。

3.1親

// 父
<template>
  <div class="page">
    <child-component1 ></child-component1>
    <child-component2 ></child-component2>
  </div>
</template>

<script>

import ChildComponent1 from '@/components/ChildComponent1.vue'
import ChildComponent2 from '@/components/ChildComponent2.vue'
export default {
    
    
  components: {
    
    
    ChildComponent1,
    ChildComponent2
  }
}
</script>

// 子1
<template>
  <div class="container">
    <div @click="onClick">子组件1</div>
  </div>
</template>

<script>
export default {
    
    
  created () {
    
    

  },
  methods: {
    
    
    onClick () {
    
    
      this.$parent.$emit('hi', '你好')
    }
  }
}
</script>

// 子2
<template>
  <div class="container">
    <div>子组件2</div>
  </div>
</template>

<script>
export default {
    
    
  created () {
    
    
    this.$parent.$on('hi', (data) => {
    
    
      alert(data)
    })
  },
  methods: {
    
    }
}
</script>

4父は孫に価値を渡す

4.1注入を提供する

コンポーネントレベルが多すぎる場合に使用します。
親コンポーネントは提供を提供し、他のコンポーネントは注入を通じて値を取得します。これは、コンポーネントライブラリの開発でよく使用されます。

// 父
provide() {
    
    
	return {
    
    
		name: '小明'
	}
}

// 子
inject: ['name']

5任意の2つのコンポーネント間

5.1 eventBus

eventBusを介して、同じバスを参照して通信します

// bus.js
import Vue from 'vue'
const Bus = new Vue()
export default Bus

// 组件1
<template>
  <div class="container">
    <div @click="onClick">子组件1</div>
  </div>
</template>

<script>
import Bus from '@/bus.js'
export default {
    
    
  created () {
    
    

  },
  methods: {
    
    
    onClick () {
    
    
      Bus.$emit('hi', '你好')
    }
  }
}
</script>

6. vuex

Vuexの状態ストレージは応答性があります。Vueコンポーネントがストアから状態を読み取るときに、ストア内の状態が変化すると、対応するコンポーネントがそれに応じて更新されます。

おすすめ

転載: blog.csdn.net/m0_37797410/article/details/108974619