Rumah  >  Soal Jawab  >  teks badan

Hantar data daripada komponen ke subkomponen dalam vue 3

<p>Saya cuba melakukan ini dengan menghantar data daripada komponen induk saya <kod>formTelemarketing</kod> kepada komponen anak saya <kod>nAsignedCalls</code> ;kod> Laksanakan prop dalam prop: { daftar: Nombor },</code> /code> dan Dapatkan nilai daripada borang dan gunakan $emit untuk menghantar prop ke komponen saya</p> <pre class="brush:php;toolbar:false;">this.$emit("registers", getCall(toRef(param_search,'param_search')))</pre> <p>Dalam komponen anak yang terkandung dalam komponen induk saya, saya mempunyai: </p> <pre class="brush:php;toolbar:false;"><div id="app5"> <nAsignedCalls @registers="getCall"></nAsignedCalls> </div></pra> <p>Dalam komponen anak lalai eksport saya, saya mempunyai prop:['register'] dan dalam komponen ini dalam jadual saya, saya mempunyai for-each yang sepatutnya mendapatkan semua data daripada prop ini...I Tiada ralat muncul dalam konsol tetapi saya tidak dapat memaparkan data saya</p> <pre class="brush:php;toolbar:false;">{{ (daftar) ? <template v-for="item daftar"> <tr> <td>{{ item.id }}</td> <td>{{ (item.name) ? item.name : '' }} </td></pre> <p>Sebagai contoh, ini adalah struktur saya, saya mempunyai syarat untuk mengetahui sama ada pendaftaran telah diisi, sentiasa mengembalikan "vacio".</p> <p>Ini ialah definisi prop saya dalam komponen kanak-kanak: </p> <pre class="brush:php;toolbar:false;">eksport lalai defineComponent({ nama: 'nAsignedCalls', props:['register'],</pre> <p>API saya baik, dalam tab rangkaian konsol saya boleh menunjukkan respons ok <kod>{"data":[{"id":895,"name":"Aguilera Muriel Fatimas",< ;/ kod> saya mempunyai lebih banyak data...</p> <p>Saya tidak tahu apa yang saya lakukan salah, saya baru menggunakan vue...</p> <p>Terima kasih atas ulasan anda dan maaf atas bahasa Inggeris saya yang lemah</p> <p><strong>Kemas kini</strong></p> <p>Pertama, saya menggunakan API komposisi dalam projek saya. </p> <p>Sekarang, dalam komponen anak saya, saya mentakrifkan acara saya</p> <pre class="brush:php;toolbar:false;">// acara diperibadikan const emitMyEvent = (event) => kembali { keluarkan, searchId, carianNama, carianTelefon, edit, getResults, getPage, emitMyEvent, getCall }</pre> <p>Dalam app.js saya, saya mentakrifkan semula app5: </p> <pre class="brush:php;toolbar:false;">const app5 = createApp({ komponen:{ nAsignedCalls }, persediaan() { const getCall = (event) => console.log('getCall(): ' + event.target.id); kembali { getCall } } }) app5.mount('#app5')</pre> <p>Tetapi apabila saya mengklik butang saya tidak dapat memaparkan apa-apa dalam web atau konsol</p> <p><strong>Butang saya: </strong></p> <pre class="brush:php;toolbar:false;"><input type="button" class="btn btn-dark" "></pre> <p>Dengan semua skrip dalam komponen induk saya, saya mengklik butang dan memanggil fungsi itu.</p> <p>使用父组件中的所有代码更新我的问题:</p> <pre class="brush:php;toolbar:false;"><template> <div class="bekas mt-3 bg-bayang putih bulat p-3"> <div class="baris justify-content-start mt-4"> <div class="col-md-6 ml-3"> <div class="kumpulan bentuk"> <div class="baris justify-content-center"> <pilih kelas="kawalan bentuk" name="teleoperator" id="teleoperator_select" pemegang tempat="Teleoperadora"> <pilihan tersembunyi>Teleoperadora</option> </select> </div> </div> </div> </div> <div class="baris justify-content-start align-item-center mt-4"> <div class="col-md-4"> <div class="form-item"> <jenis input="teks" nama="alamat" id="alamat" diperlukan> <label untuk="alamat">Dirección</label> </div> </div> <div class="col-md-4"> <div class="form-item"> <jenis input="teks" nama="bandar" id="bandar" diperlukan> <label untuk="bandar">Ciudad</label> </div> </div> <div class="col-md-4"> <div class="form-item"> <jenis input="teks" nama="cp" id="kod_pos" diperlukan> <label untuk="pos_kod">Código Pos</label> </div> </div> </div> <div class="baris justify-content-center"> <jenis input="butang" class="btn btn-gelap" value="Buscar registros" @click="searchRegisters"> </div> </div> <div class="bekas mt-3 bg-bayang putih bulat p-3 "> <div class="baris justify-content-center"> <div class="col-md-12"> <ul class="nav nav-pills"> <li class="nav-item"> <a class="pautan navigasi aktif" data-toggle="tab" href="#nasigned">Tiada asignadas</a> </li> <li class="nav-item"> <a class="nav-link" data-toggle="tab" href="#asigned">Asignadas</a> </li> </ul> </div> <div class="bekas" style="lebar: 95% !penting;"> <div class="tab-kandungan"> <div class="tab-pane fade-in" id="ditugaskan"> <div id="app4"> <asignedCalls></asignedCalls> </div> </div> <div class="tab-pane fade-in aktif" id="nasigned"> <div id="app5"> <nAsignedCalls @registers="getCall"></nAsignedCalls> </div> </div> </div> </div> </div> </div> </template> <skrip> import { onMounted, defineComponent, toRef } daripada 'vue'; import useNregister daripada '../composables/calls' import assignedCalls daripada './roomBooss/asignedCalls'; import nAsignedCalls daripada './roomBooss/nasignedCalls'; eksport lalai defineComponent({ komponen: {asignedCalls, nAsignedCalls}, data(){ kembali{ item: [], penomboran: { halaman_semasa: 1, }, daftar: 0, } }, props: { register: Number }, persediaan(props, { emit }, context) { const emitMyEvent = (acara) => emit('mendaftar', acara); var param_search = {}; const { getCall, deleteCalls, queryForKeywords, getResults, getItems } = useNregister() function remove(id) { deleteCalls(id) } fungsi carianId(tindakan) { let id = document.getElementsByClassName('id_search')[0].value const params = [tindakan, id]; queryForKeywords(params) } fungsi carianName(tindakan) { let id = document.getElementsByClassName('name_search')[0].value const params = [tindakan, id]; queryForKeywords(params) } carian fungsiTelefon(tindakan) { let id = document.getElementsByClassName('phone_search')[0].value const params = [tindakan, id]; queryForKeywords(params) } fungsi edit(tindakan) { window.location.href = '/roomboss/telemarketing/call/'+action+"/edit"; } function show(action) { window.location.href = '/roomboss/telemarketing/call/'+action; } fungsi getPage(halaman){ getItems(halaman); } fungsi searchRegisters(){ alamat var = ""; var city = ""; var cp = ""; alamat = document.getElementById("alamat").nilai jika( alamat != "" ) { param_search["parameter"] = "alamat"; param_search["nilai"] = alamat; } bandar = document.getElementById("bandar").nilai jika( bandar != "" ) { param_search["parameter"] = "bandar"; param_search["nilai"] = bandar; }cp = document.getElementById("postal_code").value jika( cp != "" ) { param_search["parameter"] = "cp"; param_search["nilai"] = cp } context.emit("mendaftar", getCall(toRef(param_search,'param_search'))) } kembali { keluarkan, searchId, carianNama, carianTelefon, edit, menunjukkan, getResults, getPage, getCall, carianDaftar, emitMyEvent } } }) </script></pre> <p><strong>Kemas kini</strong></p> <p>Data yang saya hantar boleh dipaparkan dalam tab rangkaian, tetapi jadual saya kosong</p> <pre class="brush:php;toolbar:false;"><tbody> <template v-for="item daftar"> <tr> <td>{{ item.id }}</td> <td>{{ (item.name) ? item.name : '' }} </td> <td>{{ (item.address) ? <td>{{ (item.province) ? <td>{{ (item.city) ? item.city : ''}} </td> <td>{{ (item.cp) ? <td>{{ (item.phone) ? item.phone : ''}} </td> <td> <span class="text-light" :class="item.status.class_span"> {{ (item) ? item.status.name : 'null' }} </span> </td> <td> <div class="hover-text"> <div class="ikon-tindakan"> <div class="baris justify-content-center"> <div class="col-md-6 offset-md-1"> <i class="fas fa-cog"></i> </div> </div> </div> <kelas div="tindakan bekas"> <div class="col-md-3"> <kelas butang="teks petua alat btn" id="edit" @click="edit(item.id)"><i class="fas fa-2x fa-edit"></i></button> </div> </div> </div> </td> </tr> </template> </tbody></pre> <p>我在组件<kod>nPanggilan Ditugaskan</kod>中的脚本,我尝试在untuk和<kod>emitMyEvent</code>和<中的脚本,我尝试在untuk和<kod>emitMyEvent</code>和<中;不和中;用<kod> mendaftar</kod></p> > <pre class="brush:php;toolbar:false;"><script> import useNregister daripada '../../composables/calls' import { onMounted, defineComponent } daripada 'vue' eksport lalai defineComponent({ nama: 'nAsignedCalls', memancarkan: ['mendaftar'], data(){ kembali{ item: [], penomboran: { halaman_semasa: 1, }, newRegisters: Object.assign({}, this.registers), } }, persediaan(props, { emit }) { const { getCall, deleteCalls, queryForKeywords, getResults, getItems } = useNregister() function remove(id) { deleteDates(id) } fungsi carianId(tindakan) { let id = document.getElementsByClassName('id_search')[0].value const params = [tindakan, id]; queryForKeywords(params) } fungsi carianName(tindakan) { let id = document.getElementsByClassName('name_search')[0].value const params = [tindakan, id]; queryForKeywords(params) } carian fungsiTelefon(tindakan) { let id = document.getElementsByClassName('phone_search')[0].value const params = [tindakan, id]; queryForKeywords(params) } fungsi edit(tindakan) { window.location.href = '/roomboss/calls/'+action+"/edit"; } fungsi getPage(halaman){ getItems(halaman); } // acara peribadi const emitMyEvent = (acara) => emit('mendaftar', acara); kembali { keluarkan, searchId, carianNama, carianTelefon, edit, getResults, getPage, emitMyEvent, getCall } } }); </skrip></pre></p>
P粉481815897P粉481815897438 hari yang lalu596

membalas semua(1)saya akan balas

  • P粉916553895

    P粉9165538952023-09-02 09:42:58

    Kemas kini 2

    di setup()函数中,您必须使用Composition API

    Gunakan fungsi Composition API,您可以通过setup()中获得emit. org/api/composition-api-setup.html#setup-context" rel="nofollow noreferrer">Tetapkan konteks .

    Semak contoh pertama saya:

    Anda akan mendapat emit fungsi

    setup(props, { emit })

    Kemudian gunakan terus

    emit("registers", getCall(toRef(param_search,'param_search')))

    Dalam kes anda, anda melepasi konteks tetapan supaya anda boleh memanggil melalui konteks context调用emit

    context.emit("registers", getCall(toRef(param_search,'param_search')))

    Nampaknya anda tidak perlu menentukan acara tersuai, tetapi saya tetap mengesyorkannya:

    emits: ['registers']

    Sila ambil perhatian, this.$emit() 调用由 Options API 使用,而不是 Composition API

    const { createApp, ref } = Vue;
    
    const MyComp = {
      setup(props, { emit }) {
        const emitMyEvent = (event) => emit('registers', event);
        return { emitMyEvent }
      },
      template: `<button id="my-button" @click="emitMyEvent">emit</button>`
    }
    
    const App = { 
      components: { MyComp },
      setup() {
        const getCall = (event) => console.log('getCall(): ' + event.target.id);
        return { getCall }
      }
      
    }
    const app = createApp(App)
    app.mount('#app')
    #app { line-height: 2; }
    [v-cloak] { display: none; }
    <div id="app" v-cloak>
      <my-comp @registers="getCall"></my-comp> 
    </div>
    <script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>

    Dikemas kini

    adalah sama seperti menggunakan this.$emitOptions API

    const { createApp, ref } = Vue;
    
    const MyComp = {
      emits: ['registers'],  
      methods: {
        emitMyEvent: function(event) { this.$emit('registers', event) }
      },
      template: `<button id="my-button" @click="emitMyEvent">emit</button>`
    }
    
    const App = { 
      components: { MyComp },
      methods: {
        getCall: (event) => console.log('getCall(): ' + event.target.id)
      } 
    }
    const app = createApp(App)
    app.mount('#app')
    #app { line-height: 2; }
    [v-cloak] { display: none; }
    <div id="app" v-cloak>
      <my-comp @registers="getCall"></my-comp> 
    </div>
    <script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>

    balas
    0
  • Batalbalas