Vuejs Доступ к данным в модальном компоненте с помощью реквизита - PullRequest
0 голосов
/ 15 мая 2019

Есть очень похожие вопросы к тому, который я задаю, но предложенные решения не соответствуют моей ситуации.Я пытаюсь получить доступ к данным из родительского списка в другом компоненте, используя модальный компонент в VUE.Я попытался передать значение prop в цикле, а также используемый компонент в родительском представлении, но не получил данных.

Это родительский шаблон.

    <template>
    <table class="table table-bordered table-stripped" v-if="users.length>0">
        <caption>List of Contacts</caption>
        <thead>
            <tr>
                <th scope="col">#</th>
                <th scope="col">Name</th>
                <th scope="col">Action</th>
            </tr>
        </thead>
        <tbody>
            <tr v-for="(user, index) in users" :key="user.id">
                <td>{{index+1}}</td>
                <td>{{user.name}}</td>
                <td>
                    <button type="button" class="btn btn-success btn-sm" @click="initEdit(user)" :euser="user">Edit</button>
                </td>
            </tr>
        </tbody>
    </table>
    <edit-user v-if="showEditUser" :showEditUser.sync="showEdit"></edit-user>
</template>

<script>
import editUser from '@/components/editUser.vue';
export default {
  name: 'listusers',
  components: {
        'edit-user': editUser,
    },
    data() {
      return {
          user: [],
          users: [],
          euser: {},
          showEdit: false,
        };
  },
    methods: {
        initEdit() {
            this.showEditUser = true;
        },
    },
};
</script>

И этоМодальный компонент.

    <template>
        <transition name="modal" role="dialog">
            <div class="modal" style="display: block">
                <div class="modal-dialog" role="document">
                    <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title">Edit Contact</h5>
                    </div>
                    <div class="modal-body">
                        <p>{{euser}}</p>
                        <p>{{euser.id}}</p>
                    </div>
                    <div class="modal-footer">
                            <button type="button" class="btn btn-default" @click="closeModal">Close</button>
                    </div>
                    </div>
                </div>
            </div>
        </transition>
    </template>
<script>

export default {
    name: 'editUser',
    props: {
      euser: {
        type: Object,
      },
      showEdit: {
          'default' : false,
      }
    },
    data() {
        return {
            edit_user: [],
        };
    },
  methods: {
        closeModal(){
            this.$emit('update:showEdit');
        },
  },
};
</script>

Я попытался передать значение проп в цикле, как показано выше, а также в компоненте, показанном ниже.

<edit-user v-if="showEditUser" :showEditUser.sync="showEdit" :euser="user"></edit-user>

Как получить одного пользователяот родителя для отображения в модале?

Ответы [ 3 ]

2 голосов
/ 15 мая 2019

В родительском компоненте вы можете создать свойство данных с именем "currUser: null", а в методе "initUser" вы можете сделать следующее:

initEdit(user){
    this.currUser=user;
    this.showEditUser = true;
}

тогда определение вашего модального компонента будет выглядеть следующим образом:

<edit-user v-if="showEditUser" :showEditUser.sync="showEdit" :euser="currUser"> 
</edit-user>
0 голосов
/ 15 мая 2019

Во-первых, вы должны передать euser реквизит компоненту <edit-user/>, а не кнопке, которая вызовет редактирование.

Во-вторых, функция initEdit() должна выглядеть примерно так

initEdit(user) {
  this.user = user
  this.showEditUser = true
}

В-третьих, если вы планируете редактировать пользователя в модальном режиме, вам, вероятно, потребуется создать копию пользователя в дочернем компоненте.

watch: {
  showEditUser() {
    this.editableUser = JSON.parse(JSON.stringify(this.euser))
  }
}

, тогда все v-models вребенок должен указать на this.editableUser.когда пользователь собирается сохранить изменения, вы можете запустить новую функцию, которая может передать новую версию родительскому элементу, например,

saveEdit() {
   this.$emit('save', this.editableUser)
}

, вам просто нужно поймать сохранение в компоненте <edit-user />вот так

<edit-user v-show="showEditUser" :showEditUSer.sync="showEdit" :euser="user" @save="saveUser" />

//script...data...methods
saveUser(user) {
  let ind = this.users.map(u => u.id).indexOf(user.id)
  if(ind != -1) {
    Object.assign(this.users[ind], user) //put user back where it belongs with new data
  }
}
0 голосов
/ 15 мая 2019

Просто передать пользователя следующим образом:

<edit-user v-if="showEditUser" :showEditUser.sync="showEdit" :euser="user[indexOfUser]"></edit-user>

И изменить свойства реквизита для получения объекта, а не массива

  euser: {
    type: Object,
  },

Просто попробуйте добавить данные основного компонента.пользователю только для тестирования, если оттуда возникает проблема «неопределенная».а в :euser="user[0]"

user: [{
   id: 1
}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...