登录  /  注册
博主信息
博文 45
粉丝 0
评论 0
访问量 33424
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
VUE父子组件之间通信
咸鱼老爷
原创
592人浏览过

组件

从形式上看是一个自定义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>

批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学