首页  >  问答  >  正文

vue 3中从组件向子组件发送数据

<p>我正在尝试将数据从我的父组件 <code>formTelemarketing</code> 发送到我的子组件 <code>nAsignedCalls</code> 来执行此操作,我正在父 <code>props 中执行一个 prop : { register: Number },</code> 当我单击提交按钮(不是提交按钮)时应该填充一个表格,我的操作按钮调用函数 <code>searchRegisters</code> 并从表单中获取值并使用 $emit 将 prop 发送到我的组件</p> <pre class="brush:php;toolbar:false;">this.$emit("registers", getCall(toRef(param_search,'param_search')))</pre> <p>在我的父组件中包含的子组件中,我有:</p> <pre class="brush:php;toolbar:false;"><div id="app5"> <nAsignedCalls @registers="getCall"></nAsignedCalls> </div></pre> <p>在我的导出默认子组件中,我有 props:['register'],在我的表中这个组件中,我有一个 for-each 应该从这个道具中获取所有数据...我没有控制台中出现任何错误,但我无法显示我的数据</p> <pre class="brush:php;toolbar:false;">{{ (register) ? register : "vacio" }} <template v-for="item of register"> <tr> <td>{{ item.id }}</td> <td>{{ (item.name) ? item.name : '' }} </td></pre> <p>例如,这是我的结构,我有一个条件来知道注册是否已填充,始终返回“vacio”。</p> <p>这是我在子组件中的 props 定义:</p> <pre class="brush:php;toolbar:false;">export default defineComponent({ name: 'nAsignedCalls', props:['register'],</pre> <p>我的 API 没问题,在控制台网络选项卡中我可以显示响应 ok <code>{"data":[{"id":895,"name":"Aguilera Muriel Fatimas",</code> i有更多数据...</p> <p>我不知道我做错了,我是 vue 的新手......</p> <p>感谢您的自述,并为我的英语不好而抱歉</p> <p><strong>更新</strong></p> <p>首先,我在我的项目中使用组合 API。</p> <p>现在,在我的子组件中我定义了我的事件</p> <pre class="brush:php;toolbar:false;">// personaliced event const emitMyEvent = (event) => emit('registers', event); return { remove, searchId, searchName, searchPhone, edit, getResults, getPage, emitMyEvent, getCall }</pre> <p>在我的 app.js 中,我重新定义了 app5:</p> <pre class="brush:php;toolbar:false;">const app5 = createApp({ components:{ nAsignedCalls }, setup() { const getCall = (event) => console.log('getCall(): ' + event.target.id); return { getCall } } }) app5.mount('#app5')</pre> <p>但是当我单击按钮时,我无法在网络或控制台中显示任何内容</p> <p><strong>我的按钮:</strong></p> <pre class="brush:php;toolbar:false;"><input type="button" class="btn btn-dark" value="Buscar registros" @click="searchRegisters()"></pre> <p>我的父组件中的所有内容脚本,我正在单击按钮并调用函数。</p> <p>使用父组件中的所有代码更新我的问题:</p> <pre class="brush:php;toolbar:false;"><模板> <div class="container mt-3 bg-白色阴影圆形 p-3"> <div class="row justify-content-start mt-4"> <div class=“col-md-6 ml-3”> <div class="form-group"> <div class="row justify-content-center"> <选择类=“表单控件” name="远程操作员" id="teleoperator_select" placeholder=“Teleoperadora”> <隐藏选项>Teleoperadora </选择>
<div class="col-md-4">
<输入类型=“文本”;名称=“地址”; id=“地址”;必填>
<div class="col-md-4">
<输入类型=“文本”;名称=“城市” id=“城市”必填> <label for=“city”>Ciudad</label>
<div class="col-md-4">
<输入类型=“文本”;名称=“cp” id="邮政编码"必填>
<div class="row justify-content-center"> <输入类型=“按钮”类=“btn btn-dark” value="Buscar registros"; @click=“搜索寄存器”> ;
<div class="row justify-content-center"> <div class="col-md-12"> <ul class=“nav nav-pills”> <li class="nav-item"> <a class=“nav-link active” data-toggle=“选项卡” href=“#nasigned”>无分配 </li> <li class="nav-item"> <a class=“nav-link” data-toggle=“选项卡” href=“#asigned”>Asignadas </li> </ul>
<div class="tab-content">
<div id="app4">
<div id="app5">
; </模板> <脚本> 从 'vue' 导入 { onMounted, DefineComponent, toRef }; 从 '../composables/ncalls' 导入 useNregister 从 './roomBooss/asignedCalls' 导入 asignedCalls; 从 './roomBooss/nasignedCalls' 导入 nAsignedCalls; 导出默认定义组件({ 组件:{asignedCalls,nAsignedCalls}, 数据(){ 返回{ 项目: [], 分页:{ 当前页:1, }, 注册:0, } }, 道具:{寄存器:数字}, 设置(道具,{发出},上下文){ const emitMyEvent = (事件) =>;发出('注册',事件); var param_search = {}; const { getCall、deleteCalls、queryForKeywords、getResults、getItems } = useNregister() 函数删除(id){ 删除通话(id) } 函数 searchId(动作) { 让 id = document.getElementsByClassName('id_search')[0].value const params = [动作, id]; 查询关键字(参数) } 函数搜索名称(动作){ 让 id = document.getElementsByClassName('name_search')[0].value const params = [动作, id]; 查询关键字(参数) } 函数搜索电话(动作){ 让 id = document.getElementsByClassName('phone_search')[0].value const params = [动作, id]; 查询关键字(参数) } 函数编辑(动作){ window.location.href = '/roomboss/电话营销/call/'+action+"/edit"; } 函数显示(动作){ window.location.href = '/roomboss/电话营销/call/'+action; } 函数 getPage(页面){ 获取项目(页面); } 函数搜索寄存器(){ var 地址 = ""; var 城市 = ""; var cp = ""; 地址 = document.getElementById(“地址”).value if( 地址 != "" ) { param_search[“参数”] = “地址”; param_search[“值”] = 地址; } 城市 = document.getElementById(“城市”).value if( 城市 != "" ) { param_search[“参数”] = “城市”; param_search[“值”] = 城市; }cp = document.getElementById("postal_code").value if( cp != "" ) { param_search["parameter"] = "cp"; param_search["value"] = cp } context.emit("registers", getCall(toRef(param_search,'param_search'))) } return { remove, searchId, searchName, searchPhone, edit, show, getResults, getPage, getCall, searchRegisters, emitMyEvent } } }) </script></pre> <p><strong>更新</strong></p> <p>我发送的数据可以在网络选项卡中显示,但我的表格是空的</p> <pre class="brush:php;toolbar:false;"><tbody> <template v-for="item of registers"> <tr> <td>{{ item.id }}</td> <td>{{ (item.name) ? item.name : '' }} </td> <td>{{ (item.address) ? item.address : ''}}</td> <td>{{ (item.province) ? item.province : ''}} </td> <td>{{ (item.city) ? item.city : ''}} </td> <td>{{ (item.cp) ? item.cp : ''}} </td> <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="icon-actions"> <div class="row justify-content-center"> <div class="col-md-6 offset-md-1"> <i class="fas fa-cog"></i> </div> </div> </div> <div class="container-actions"> <div class="col-md-3"> <按钮类=“工具提示文本btn” id="编辑" @click=“编辑(item.id)”><i class=“fas fa-2x fa-edit”></i></button> ; </td> </tr> </template> </tbody></pre> <p>我在组件<code>nAsignedCalls</code>中的脚本,我尝试在for和<code>emitMyEvent</code>和<code>newRegisters</code>中使用<code>registers</code></p> > <pre class="brush:php;toolbar:false;"><script> import useNregister from '../../composables/ncalls' import { onMounted, defineComponent } from 'vue' export default defineComponent({ name: 'nAsignedCalls', emits: ['registers'], data(){ return{ items: [], pagination: { current_page: 1, }, newRegisters: Object.assign({}, this.registers), } }, setup(props, { emit }) { const { getCall, deleteCalls, queryForKeywords, getResults, getItems } = useNregister() function remove(id) { deleteDates(id) } function searchId(action) { let id = document.getElementsByClassName('id_search')[0].value const params = [action, id]; queryForKeywords(params) } function searchName(action) { let id = document.getElementsByClassName('name_search')[0].value const params = [action, id]; queryForKeywords(params) } function searchPhone(action) { let id = document.getElementsByClassName('phone_search')[0].value const params = [action, id]; queryForKeywords(params) } function edit(action) { window.location.href = '/roomboss/calls/'+action+"/edit"; } function getPage(page){ getItems(page); } // personaliced event const emitMyEvent = (event) => emit('registers', event); return { remove, searchId, searchName, searchPhone, edit, getResults, getPage, emitMyEvent, getCall } } }); </script></pre></p>
P粉481815897P粉481815897413 天前577

全部回复(1)我来回复

  • P粉916553895

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

    更新2

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

    使用Composition API,您可以通过setup()中获得emit函数。 org/api/composition-api-setup.html#setup-context" rel="nofollow noreferrer">设置上下文

    检查我的第一个示例:

    您将获得 emit 函数

    setup(props, { emit })

    然后直接使用

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

    在您的情况下,您传递了设置上下文,因此您可以通过context调用emit

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

    看来您确实不需要定义自定义事件,但我仍然推荐它:

    emits: ['registers']

    请注意,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>

    更新

    与使用 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>

    回复
    0
  • 取消回复