• `,
  • props: {
  • /* msg:{
  • type: Array
  • } */
  • /* msg:{
  • type: Object
  • } */
  • msgab:{
  • type:Function
  • },
  • },
  • methods:{
  • sum(){
  • this.msgab()
  • }
  • }
  • }
  • }
  • })
  • script>
  • body>
  • html>
  • 2.子传父

    ​ 子组件向父组件传值,使用自定义事件$emit

    1. <div id="app">
    2. <cpn @itemclick="cpnClcik">cpn>
    3. div>
    4. <template id="cpn">
    5. <div>
    6. <button v-for="(item, index) in categoties" :key="index" @click="btnClick(item)">{{item.name}}button>
    7. div>
    8. template>
    9. <script src="../js/vue.js">script>
    10. <script>
    11. const cpn = {
    12. template: "#cpn",
    13. data() {
    14. return {
    15. categoties: [{
    16. id: 'aaa',
    17. name: '热门推荐'
    18. },
    19. {
    20. id: 'bbb',
    21. name: '手机数码'
    22. },
    23. {
    24. id: 'ccc',
    25. name: '家用家电'
    26. },
    27. {
    28. id: 'ddd',
    29. name: '电脑办公'
    30. },
    31. ]
    32. }
    33. },
    34. methods: {
    35. btnClick(item) {
    36. this.$emit('itemclick', item)
    37. }
    38. },
    39. };
    40. const app = new Vue({
    41. el: "#app",
    42. data() {
    43. return {
    44. }
    45. },
    46. methods: {
    47. cpnClcik(item) {
    48. console.log('cpnClick'+item.name);
    49. }
    50. },
    51. components: {
    52. cpn
    53. },
    54. })
    55. script>

    1.在子组件中定义一个方法btnClick(item),使用$emit,'itemclick'是事件名,item是传过去的值。

    1. methods: {
    2. btnClick(item) {
    3. this.$emit('itemclick', item)
    4. }
    5. },

    2.在子组件中监听点击事件并回调此方法

    1. <button v-for="(item, index) in categoties" :key="index" @click="btnClick(item)">{{item.name}}button>

    3.在父组件中定义一个方法cpnClcik(item)

    1. methods: {
    2. cpnClcik(item) {
    3. console.log('cpnClick'+item.name);
    4. }
    5. },

    4.并在父组件(vue实例)中调用不写参数默认传递btnClick的item ),父组件监听事件名为itemclick的子组件传过来的事件。

    "cpnClcik">

    四、父访问子(children、ref)

    1.children、ref基本用法

    ​ 父组件访问子组件,有时候需要直接操作子组件的方法,或是属性,此时需要用到$children$ref

    使用this.$children直接获取**当前实例的直接子组件,需要注意 $children 并不保证顺序,也不是响应式的。**如果你发现自己正在尝试使用 $children 来进行数据绑定,考虑使用一个数组配合 v-for 来生成子组件,并且使用 Array 作为真正的来源。

    1. <div id="app">
    2. <cpn>cpn>
    3. <cpn>cpn>
    4. <cpn ref="aaa">cpn>
    5. <button @click="btnClick" >按钮button>
    6. div>
    7. <template id="cpn">
    8. <div>
    9. 我是子组件
    10. div>
    11. template>
    12. <script src="../js/vue.js">script>
    13. <script>
    14. // 父传子:props
    15. const cpn = {
    16. template: "#cpn",
    17. data() {
    18. return {
    19. name:"我是子组件的name"
    20. }
    21. },
    22. methods: {
    23. showMessage(){
    24. console.log("showMessage");
    25. }
    26. },
    27. };
    28. const app = new Vue({
    29. el: "#app",
    30. data() {
    31. return {
    32. message:"hello"
    33. }
    34. },
    35. methods: {
    36. btnClick(){
    37. // 1.children
    38. // console.log(this.$children[0].showMessage)
    39. // for (let cpn of this.$children) {
    40. // console.log(cpn.showMessage)
    41. // }
    42. // 2.$ref
    43. console.log(this.$refs.aaa.name)
    44. }
    45. },
    46. components: {
    47. cpn
    48. },
    49. })
    50. script>

    $children方式

    1. // 1.children
    2. console.log(this.$children[0].showMessage)
    3. for (let cpn of this.$children) {
    4. console.log(cpn.showMessage)
    5. }

    $refs方式:ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例

    2.ref的基本使用 用在元素上

    1. ref的基本使用 用在元素上
    2. DOCTYPE html>
    3. <html>
    4. <head>
    5. <meta charset="utf-8">
    6. <title>title>
    7. head>
    8. <body>
    9. <div id="app">
    10. <p ref="p" @click="handelClick" id="ppp">hellop>
    11. div>
    12. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js">script>
    13. <script>
    14. const app = new Vue({
    15. el: "#app",
    16. data: {
    17. },
    18. methods: {
    19. handelClick(){
    20. console.log(this.$refs.p);
    21. const ppp = document.querySelector('#ppp')
    22. console.log(ppp);
    23. }
    24. },
    25. computed:{
    26. }
    27. })
    28. script>
    29. body>
    30. html>

    3.ref在子组件上的使用

    1. ref可以调用组件中的数据 

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. head>
    7. <body>
    8. <div id="app">
    9. <counter ref="one" @change="handelChange">counter>
    10. <counter ref="two" @change="handelChange">counter>
    11. <div>total:{{total}}div>
    12. div>
    13. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js">script>
    14. <script>
    15. Vue.component('counter',{
    16. template:'
      {{number}}
      '
      ,
    17. data(){
    18. return {
    19. number:0
    20. }
    21. },
    22. methods:{
    23. handelclick(){
    24. this.number++;
    25. this.$emit('change');
    26. }
    27. }
    28. })
    29. const app = new Vue({
    30. el: "#app",
    31. data: {
    32. total:0
    33. },
    34. methods: {
    35. handelChange(){
    36. this.total = this.$refs.one.number + this.$refs.two.number
    37. }
    38. },
    39. computed:{
    40. }
    41. })
    42. script>
    43. body>
    44. html>

    2.ref可以调用组件中的方法

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. head>
    7. <body>
    8. <div id="app">
    9. <helloworld ref="hello">helloworld>
    10. <button @click="getHello">获取helloworld组件中的值button>
    11. div>
    12. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js">script>
    13. <script>
    14. Vue.component('helloworld',{
    15. template:'
      '
      ,
    16. data(){
    17. return {
    18. number:0
    19. }
    20. },
    21. methods:{
    22. handelclick(){
    23. console.log('被调用了');
    24. }
    25. }
    26. })
    27. const app = new Vue({
    28. el: "#app",
    29. data: {
    30. },
    31. methods: {
    32. getHello(){
    33. this.$refs.hello.handelclick();
    34. console.log(this.$refs.hello.number);
    35. console.log(this.$refs.hello.$el.innerHTML);
    36. }
    37. },
    38. computed:{
    39. }
    40. })
    41. script>
    42. body>
    43. html>

    四、动态组件(is、component

    1.is用于动态组件且基于 DOM 内模板的限制来工作。

    1. 基于 DOM 内模板的限制来工作
    2. DOCTYPE html>
    3. <html>
    4. <head>
    5. <meta charset="utf-8">
    6. <title>title>
    7. head>
    8. <body>
    9. <div id="app">
    10. <table>
    11. <tr is="row">
    12. tr>
    13. table>
    14. div>
    15. <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js">script>
    16. <script>
    17. Vue.component('row',{
    18. template:'111'
    19. })
    20. const app = new Vue({
    21. el: "#app",
    22. data() {
    23. return {}
    24. },
    25. methods: {
    26. },
    27. computed:{
    28. }
    29. })
    30. script>
    31. body>
    32. html>

    2.动态组件component

    1. DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. head>
    7. <body>
    8. <div id="app">
    9. <component :is="type">component>
    10. <button @click="handerClick">点击button>
    11. div>
    12. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
    13. <script>
    14. Vue.component('child-one',{
    15. template:'
      child-one
      '
    16. })
    17. Vue.component('child-two',{
    18. template:'
      child-two
      '
    19. })
    20. const app = new Vue({
    21. el:'#app',
    22. data(){
    23. return {
    24. type:'child-one'
    25. }
    26. },
    27. methods:{
    28. handerClick(){
    29. console.log('111');
    30. this.type=this.type==='child-one'?'child-two':'child-one';
    31. }
    32. }
    33. })
    34. script>
    35. body>
    36. html>

    3.动态组件官网案例

    1. 这是动态组件官网案例
    2. DOCTYPE html>
    3. <html>
    4. <head>
    5. <meta charset="utf-8">
    6. <title>title>
    7. <style>
    8. .tab-button {
    9. padding: 6px 10px;
    10. border-top-left-radius: 3px;
    11. border-top-right-radius: 3px;
    12. border: 1px solid #ccc;
    13. cursor: pointer;
    14. background: #f0f0f0;
    15. margin-bottom: -1px;
    16. margin-right: -1px;
    17. }
    18. .tab-button:hover {
    19. background: #e0e0e0;
    20. }
    21. .tab-button.active {
    22. background: #e0e0e0;
    23. }
    24. .tab {
    25. border: 1px solid #ccc;
    26. padding: 10px;
    27. }
    28. style>
    29. head>
    30. <body>
    31. <div id="app">
    32. <button v-for="(tab,index) in tabs":key="index" @click="handelclick(tab)" :class="getStyle(tab)">{{tab}}button>
    33. <component :is="currentTabComponent">component>
    34. div>
    35. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">script>
    36. <script>
    37. Vue.component('tab-home',{
    38. template:'
      child-one
      '
    39. })
    40. Vue.component('tab-posts',{
    41. template:'
      child-two
      '
    42. })
    43. Vue.component('tab-archive',{
    44. template:'
      child-three
      '
    45. })
    46. const app = new Vue({
    47. el:'#app',
    48. data(){
    49. return {
    50. currentTab: "Home",
    51. tabs: ["Home", "Posts", "Archive"]
    52. }
    53. },
    54. methods:{
    55. handelclick(tab){
    56. this.currentTab = tab
    57. },
    58. getStyle(tab){
    59. return ['tab-button',{active:this.currentTab===tab}]
    60. }
    61. },
    62. computed:{
    63. currentTabComponent(){
    64. /* return `tab-${this.currentTab}`.toLowerCase() */
    65. return "tab-"+this.currentTab.toLowerCase()
    66. },
    67. }
    68. })
    69. script>
    70. body>
    71. html>

  • 相关阅读:
    呕血回顾一次提高接口并发的经历,很实用
    【深入浅出C#】章节10: 最佳实践和性能优化:性能调优和优化技巧
    shell
    是js高级啊~
    数据仓库相关
    DOE认证是什么
    Opengl之立方体贴图
    Python:实现miller rabin米勒-拉宾素性检验算法(附完整源码)
    MVC Controlle View Model之间新建类
    Python实现PU口袋活动更新提醒
  • 原文地址:https://blog.csdn.net/yzq0820/article/details/126255306