【问题标题】:Vue.js Display call one component from another componentVue.js 显示从另一个组件调用一个组件
【发布时间】:2017-04-03 19:54:21
【问题描述】:

我有 2 个组件:

Vue.component('repo-button', {
  props:["check_in_id", "repo_id"],
  template: '#repo-button',
  methods: {
    fetchRepo: function() {
        url = window.location.href.split("#")[0] + "/check_ins/" + this.check_in_id + "/repositionings/" + this.repo_id + ".json"
        cl(url)
        cl(this)
        var that;
        that = this;

        $.ajax({
            url: url,
            success: function(data) {
                cl(data)
                that.showRepo();
            }
        })

    },
    showRepo: function() {
        // what do I put here to display the modal 
    }
  },
  data: function() {
  var that = this;
  return {

  }
}
});

Vue.component('repo-modal', {
    template: "#repo-modal",
    data: function() {
        return {
            status: 'none'
        }
    }
});

var repositionings = new Vue({
    el: "#repo-vue"
});

...我的视图由一个按钮和一个模式组成。我希望该按钮在 repo-button 组件上调用 fetchRepo 并显示模式(将其 status 属性从 none 更改为 block

<script type="text/x-template" id="repo-button">
    <div class='socialCircle-item success'>
    <i class='fa fa-comment' 
         @click="fetchRepo"
      :data-check_in='check_in_id' 
      :data-repo='repo_id'> 
    </i>
  </div>
</script>

<script type="text/x-template" id="repo-modal">
    <div  v-bind:style="{ display: status }" class="modal" id="vue-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-client_id="<%= @client.id %>">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <h4 class="modal-title"></h4>
                </div>
                <div class="modal-body"></div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-danger btn-simple" data-dismiss="modal">Close</button>
                </div>
            </div>
        </div>
    </div>
</script>

<div id="repo-vue">
    <div is="repo-modal"></div>
    <div is="repo-button" repo_id="<%= ci.repositioning.id %>" check_in_id="<%= ci.id %>"></div>
</div>

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component


    【解决方案1】:

    Props down, events up

    在Vue.js中,父子组件关系可以概括为 由于道具下降,事件上升。父母通过以下方式将数据传递给孩子 props,子节点通过事件向父节点发送消息。

    特别是,如果组件的状态需要在外部(由父级或兄弟级)控制,则该状态应作为来自父级的 prop 传入。事件向父级指示应该更改状态。

    模态框的状态由事件本身和同级组件中的事件控制。因此状态存在于父级中,并作为道具传递给模态。单击模态关闭按钮会发出(自定义)hidemodal 事件;单击同级组件的注释图标会发出 showmodal 事件。父级通过相应地设置其showRepoModal 数据项来处理这些事件。

    Vue.component('repo-button', {
      template: '#repo-button',
      methods: {
        showRepo: function() {
          this.$emit('showmodal');
        }
      }
    });
    
    Vue.component('repo-modal', {
      template: "#repo-modal",
      props: ["show"],
      computed: {
        status() {
          return this.show ? 'block' : 'none'
        }
      },
      methods: {
        hideRepo() {
          this.$emit('hidemodal');
        }
      }
    });
    
    var repositionings = new Vue({
      el: "#repo-vue",
      data: {
        showRepoModal: false
      }
    });
    .socialCircle-item i {
      cursor: pointer;
    }
    <link href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" />
    <script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.2.6/vue.min.js"></script>
    <template id="repo-button">
        <div class='socialCircle-item success'>
        <i class='fa fa-comment' 
             @click="showRepo"
             >
        </i>
      </div>
    </template>
    
    <template id="repo-modal">
        <div  v-bind:style="{ display: status }" class="modal" id="vue-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" >
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <h4 class="modal-title"></h4>
                    </div>
                    <div class="modal-body"></div>
                    <div class="modal-footer">
                        <button type="button" @click="hideRepo" class="btn btn-danger btn-simple" data-dismiss="modal">Close</button>
                    </div>
                </div>
            </div>
        </div>
    </template>
    
    <div id="repo-vue">
      <div is="repo-modal" :show="showRepoModal" @hidemodal="showRepoModal = false"></div>
      <div is="repo-button" @showmodal="showRepoModal = true"></div>
    </div>

    【讨论】:

    • 这是一个很好的解释,谢谢。我应该为此创建另一个问题,但是如果我想将数据从 repo-button 传递到模态(用于模态内容),我该怎么做?
    • 作为emit 中的参数,如this.$emit('showmodal', 'some content');,您的事件处理程序需要是一个方法(如@showmodal="doShowModal"),它将接收参数并处理它们。跨度>
    猜你喜欢
    • 2016-07-14
    • 2020-04-05
    • 2016-05-22
    • 1970-01-01
    • 2018-06-14
    • 2017-08-16
    • 2020-10-25
    • 2017-06-12
    • 2017-08-19
    相关资源
    最近更新 更多