1

I've created a modal component in Vue JS. It has to display all the names typed in the form. It doesn't work. What I can do to solve this problem? I'm new in Vue JS. Also I can't use shorthands. Do you know why? PLease help me. Thank you in advance. This is my code:

<template>
  <div class="template_class">
  <div>
  <b-btn v-b-modal.modal1>Launch demo modal</b-btn>

  <!-- Main UI -->
  <div class="mt-3 mb-3">
    Submitted Names:
    <ul>
      <li v-for="n in names">{{n}}</li>
    </ul>
  </div>

  <!-- Modal Component -->
  <b-modal id="modal1" title="Submit your name" @ok="submit" @shown="clearName">

    <form @submit.stop.prevent="submit">
      <b-form-input type="text" placeholder="Enter your name" v-model="name"></b-form-input>
    </form>

  </b-modal>
</div>  
  </div>
</template>

<script>

export default {
  data: {
    name: '',
    names: []
  },
  methods: {
    clearName() {
        this.name = '';
      },
      submit(e) {
        if (!this.name) {
          alert('Please enter your name');
          return e.cancel();
        }

        this.names.push(this.name);
        this.name = '';
      }
  }
}

</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>
2
  • Please be more clear than "doesn't work" about what you expect it to do that it is not doing. Also helpful to mention that you're using Bootstrap Vue. Commented Aug 11, 2017 at 17:52
  • It has to display all the names typed on form. But it doesen't. Commented Aug 11, 2017 at 17:57

2 Answers 2

2

This works as expected for me. Edit I removed the @shown binding from the modal, as it seems to introduce some bugginess.

new Vue({
  el: '#app',
  data: {
    name: 'Pigman',
    names: []
  },
  methods: {
    clearName() {
      this.name = "";
    },
    submit(e) {
      if (!this.name) {
        alert('Please enter your name');
        return e.cancel();
      }

      this.names.push(this.name);
      this.clearName();
    }
  }
});
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script>
<!-- Add this to <head> -->
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap@next/dist/css/bootstrap.min.css" />
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.css" />

<!-- Add this after vue.js -->
<script src="//unpkg.com/babel-polyfill@latest/dist/polyfill.min.js"></script>
<script src="//unpkg.com/tether@latest/dist/js/tether.min.js"></script>
<script src="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.js"></script>

<div id="app" class="template_class">
  <div>
    <b-btn v-b-modal.modal1>Launch demo modal</b-btn>
    Current name: {{name}}

    <!-- Main UI -->
    <div class="mt-3 mb-3">
      Submitted Names:
      <ul>
        <li v-for="n in names">{{n}}</li>
      </ul>
    </div>

    <!-- Modal Component -->
    <b-modal id="modal1" title="Submit your name" @ok="submit">

      <form @submit.stop.prevent="submit">
        <b-form-input type="text" placeholder="Enter your name" v-model="name"></b-form-input>
      </form>

    </b-modal>
  </div>
</div>

Sign up to request clarification or add additional context in comments.

12 Comments

For me, it doesen't display the submited names. Can you help me? Please. :(
I opened the console and this is what i've got: [Vue warn]: Property or method "names" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option.
What OS and browser are you using?
Ubuntu 16.04 and Google Chrome.
Interesting: on Safari (Mac), the modal comes up with the lat value entered for name, despite the variable name being reset. I think there is a bug in Bootstrap-Vue.
|
0

Your code does not make any sense to me, this is a great reusable example from the vue homepage https://v2.vuejs.org/v2/examples/modal.html

This code is directly copied from the example, i only cite it as single file component:

<template>
  <transition name="modal">
    <div class="modal-mask">
      <div class="modal-wrapper">
        <div class="modal-container">

          <div class="modal-header">
            <slot name="header">
              default header
            </slot>
          </div>

          <div class="modal-body">
            <slot name="body">
              default body
            </slot>
          </div>

          <div class="modal-footer">
            <slot name="footer">
              default footer
              <button class="modal-default-button" @click="$emit('close')">
                OK
              </button>
            </slot>
          </div>
        </div>
      </div>
    </div>
  </transition>
</template>

<script>
export default{
  name: 'modal'
}
</script>

<style>
.modal-mask {
  position: fixed;
  z-index: 9998;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, .5);
  display: table;
  transition: opacity .3s ease;
}

.modal-wrapper {
  display: table-cell;
  vertical-align: middle;
}

.modal-container {
  width: 300px;
  margin: 0px auto;
  padding: 20px 30px;
  background-color: #fff;
  border-radius: 2px;
  box-shadow: 0 2px 8px rgba(0, 0, 0, .33);
  transition: all .3s ease;
  font-family: Helvetica, Arial, sans-serif;
}

.modal-header h3 {
  margin-top: 0;
  color: #42b983;
}

.modal-body {
  margin: 20px 0;
}

.modal-default-button {
  float: right;
}

/*
 * The following styles are auto-applied to elements with
 * transition="modal" when their visibility is toggled
 * by Vue.js.
 *
 * You can easily play with the modal transition by editing
 * these styles.
 */

.modal-enter {
  opacity: 0;
}

.modal-leave-active {
  opacity: 0;
}

.modal-enter .modal-container,
.modal-leave-active .modal-container {
  -webkit-transform: scale(1.1);
  transform: scale(1.1);
}
</style>

1 Comment

In this fiddle it works jsfiddle.net/yyx990803/mwLbw11k/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.