Blogger Information
Blog 45
fans 0
comment 0
visits 34522
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
VUE父子组件之间通信
咸鱼老爷
Original
611 people have browsed it

组件

从形式上看是一个自定义html标签;
组件是可复用的vue实例,是构造函数Vue的子类

  1. <!-- 挂载点:是隐式声明的根组件 -->
  2. <div id="app">
  3. <child-compoent></child-compoent>
  4. </div>
  5. <script>
  6. //创建
  7. const childCompoent = Vue.extend({
  8. template: `<h1>hello</h1>`,
  9. });
  10. //注册
  11. //使用Vue.component()注册的是全局组件
  12. Vue.component("child-compoent", childCompoent);
  13. //挂载
  14. const vm = new Vue({
  15. el: '#app',
  16. });
  17. </script>

全局组件

全局可见,声明在vue实例外部,全局组件可以在多个vue实例中共享,建议 通常一个项目只有一个vue实例,尽可能不要使用全局组件,应该使用局部组件代替;

  1. <div id="app">
  2. <button-inc></button-inc>
  3. </div>
  4. <div id="root">
  5. <button-inc></button-inc>
  6. </div>
  7. <template id="inc">
  8. <div>
  9. <button @click='count++'>点赞:+{{count}}</button>
  10. </div>
  11. </template>
  12. <script>
  13. Vue.component('button-inc', {
  14. //组件中的模板代码:允许存在数据占位符的html字符串
  15. //模板内容必须写到一对父元素中
  16. // template: `
  17. // <div>
  18. // <button @click='count++'>点赞:+{{count}}</button>
  19. // </div>
  20. // `,
  21. template: '#inc',
  22. //组件中必须使用函数data()来声明组件变量
  23. data() {
  24. return {
  25. count: 0,
  26. }
  27. }
  28. });
  29. const vm = new Vue({
  30. el: '#app',
  31. })
  32. const vm1 = new Vue({
  33. el: '#root',
  34. })
  35. </script>

局部组件

局部组件是属于vue实例的,components

  1. <body>
  2. <div id="app">
  3. <hello></hello>
  4. </div>
  5. <!-- <template id="hello">
  6. <p>hello {{site}}</p>
  7. </template> -->
  8. <script>
  9. //局部组件
  10. const hello = {
  11. template: `<p>hello {{site}}</p>`,
  12. data() {
  13. return {
  14. site: 'php',
  15. }
  16. },
  17. }
  18. const vm = new Vue({
  19. el: '#app',
  20. components: {
  21. // myChild: {
  22. // // template: `<p>hello {{site}}</p>`,
  23. // template: '#hello',
  24. // data() {
  25. // return {
  26. // site: 'php',
  27. // }
  28. // },
  29. // }
  30. //简化
  31. hello,
  32. }
  33. })
  34. </script>
  35. </body>

父组件向子组件传参

组件之间的数据传递是单向的,不允许在子组件中更新父组件中的数据

  1. <body>
  2. <div id="app">
  3. <like :my-name='username' :my-count='count'></like>
  4. </div>
  5. </body>
  6. <script>
  7. const like = {
  8. props: ["myName", "myCount"],
  9. template: `
  10. <div>
  11. <button @click='num++'> 点赞:+{{num}}</button>
  12. <span> {{myName}} </span>
  13. </div>
  14. `,
  15. data() {
  16. return {
  17. num: this.myCount,
  18. }
  19. },
  20. // methods: {
  21. // inc(n) {
  22. // this.num += n;
  23. // }
  24. // }
  25. }
  26. const vm = new Vue({
  27. el: '#app',
  28. data() {
  29. return {
  30. username: '你好1',
  31. count: 0,
  32. }
  33. },
  34. components: {
  35. like
  36. }
  37. })
  38. console.log(vm.count);

子组件向父组件传参

子组件中更新父组件的数据是通过事件完成(子组件向父组件传参是通过声明同名事件来实现的)
$emit(‘父组件中要使用的方法名称’,子组件要传给父组件的值)

  1. <body>
  2. <div id="app">
  3. <like :my-name='username' :my-count='count' @click-count='handle'></like>
  4. </div>
  5. </body>
  6. <script>
  7. const like = {
  8. props: ["myName", "myCount"],
  9. template: `
  10. <div>
  11. <button @click="$emit('click-count',10)" > 点赞:+{{myCount}}</button>
  12. <span> {{myName}} </span>
  13. </div>
  14. `,
  15. }
  16. const vm = new Vue({
  17. el: '#app',
  18. data() {
  19. return {
  20. username: '你好1',
  21. count: 0,
  22. }
  23. },
  24. components: {
  25. like
  26. },
  27. methods: {
  28. handle(value) {
  29. console.log(this.count);
  30. this.count += value;
  31. this.username = 'admin'
  32. }
  33. }
  34. })
  35. console.log(vm.count);
  36. </script>

组件之间双向传参

  1. <!-- 模拟v-model指令的实现过程 -->
  2. <div id="demo">
  3. <input type="text" :value='value' @input.lazy="value=$event.target.value">
  4. <p>{{value}}</p>
  5. </div>
  6. <hr>
  7. <div id="app">
  8. <p>父组件:{{price}}元</p>
  9. <my-input :my-price='price' @input-text='handle'></my-input>
  10. </div>
  11. <script>
  12. const vue = new Vue({
  13. el: '#demo',
  14. data() {
  15. return {
  16. value: 123
  17. }
  18. }
  19. })
  20. const myInput = {
  21. props: ["my-price"],
  22. // template: `
  23. // <input type="number" :value='myPrice' @input="$emit('input-text',$event.target.value)">
  24. // `,
  25. template: `
  26. <input type="number" :value='myPrice' @input="foo">
  27. `,
  28. methods: {
  29. foo(ev) {
  30. this.$emit('input-text', ev.target.value)
  31. }
  32. }
  33. }
  34. const vm = new Vue({
  35. el: '#app',
  36. data() {
  37. return {
  38. price: 4999,
  39. }
  40. },
  41. components: {
  42. myInput
  43. },
  44. methods: {
  45. handle(value) {
  46. console.log(value);
  47. this.price = value;
  48. }
  49. }
  50. })
  51. </script>

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post