uniapp中 主页面打开选择器子页面,子页面返回选中数据

// 发送页面
uni.navigateTo({
  url: '/pages/target',
  events: {
    acceptData: (data) => { console.log(data) } // 定义监听事件
  }
});

// 接收页面
const eventChannel = this.getOpenerEventChannel();
eventChannel.emit('acceptData', {key: 'value'}); // 触发事件

一、主要功能

  1. 跨页面事件监听
    uni.navigateTo跳转时注册事件监听器,目标页面可通过getOpenerEventChannel()触发这些事件.

  2. 替代URL参数传递复杂数据
    当需要传递对象、数组等非字符串数据时,events比URL拼接更高效且无长度限制

  3. 实现页面间回调机制
    允许子页面操作完成后主动通知父页面,例如表单提交后刷新列表

二、典型应用场景

  1. 表单选择器场景
    主页面打开选择器子页面,子页面返回选中数据:

  2. // 主页面
    uni.navigateTo({
      url: '/pages/order-selector',
      events: {
        orderSelected: (order) => { this.selectedOrder = order }
      }
    });
    
    // 选择器页面
    onSelect(order) {
      getOpenerEventChannel().emit('orderSelected', order);
      uni.navigateBack();
    }

    完整实例: 主页面:

  3. 
    <template>
      <view class="container">
        <uni-forms ref="form" :model="formData">
          <uni-forms-item label="订单编号" name="order">
            <input 
              v-model="formData.order.name" 
              placeholder="请选择订单" 
              disabled
              @click="selectOrder"
            />
            <text v-if="formData.order.id" class="order-info">
              ({{formData.order.amount}}元 {{formData.order.date}})
            </text>
          </uni-forms-item>
          <!-- 其他表单字段 -->
          <button @click="submit">提交表单</button>
        </uni-forms>
      </view>
    </template>
    
    <script>
    export default {
      data() {
        return {
          formData: {
            order: { id: '', name: '', amount: '', date: '' },
            // 其他表单字段...
          }
        }
      },
      methods: {
        selectOrder() {
          uni.navigateTo({
            url: '/pages/order/select',
            events: {
              acceptOrderData: this.handleOrderSelect
            }
          });
        },
        handleOrderSelect(data) {
          this.formData.order = data;
        },
        submit() {
          console.log('提交数据:', this.formData);
        }
      }
    }
    </script>
    
    <style>
    .order-info {
      color: #888;
      margin-left: 10px;
    }
    </style>
    

    子页面

    <template>
      <view>
        <uni-list>
          <uni-list-item 
            v-for="item in orderList" 
            :key="item.id"
            :title="item.name"
            :note="`${item.amount}元 | ${item.date}`"
            clickable
            @click="selectItem(item)"
          />
        </uni-list>
      </view>
    </template>
    
    <script>
    export default {
      data() {
        return {
          orderList: [
            { id: '1001', name: '订单A', amount: '199', date: '2025-06-01' },
            { id: '1002', name: '订单B', amount: '299', date: '2025-06-15' }
          ]
        }
      },
      methods: {
        selectItem(item) {
          const eventChannel = this.getOpenerEventChannel();
          eventChannel.emit('acceptOrderData', item);
          uni.navigateBack();
        }
      }
    }
    </script>
    

uniApp中使用Vue3进行父组件通信时,如果页面需要将数据返回给父页面,通常会通过事件总线(Event Bus)或者Vuex状态管理库来进行。这里简单解释一下这两种常见的做法: **1. 使用Event Bus(事件中心):** 页面(例如`child.vue`)可以触发一个自定义事件,然后在父页面(`parent.vue`)监听这个事件并接收数据。 ```javascript // child.vue export default { methods: { sendDataBack() { this.$emit('dataFromChild', { keyData: 'value' }); } } } // parent.vue <template> <view> <child @dataFromChild="handleData"></child> </view> </template> <script> import Child from '@/components/Child.vue'; export default { components: { Child }, methods: { handleData(data) { console.log('Received data:', data); } } }; </script> ``` **2. 使用Vuex(状态管理库):** 如果涉及到更复杂的数据共享和管理,可以将数据存储在Vuex store中,页面更新数据后通过commit动作通知store,然后父页面通过actions获取最新状态。 首先,在`store.js`中创建一个action和mutation: ```javascript const state = {}; const mutations = { setData(state, data) { state.data = data; } }; const actions = { async sendDataToParent({ commit }, data) { await commit('setData', data); } }; export default { state, mutations, actions }; ``` 然后在页面中调用`dispatch`: ```javascript this.$store.dispatch('sendDataToParent', { keyData: 'value' }); ``` 在父页面的组件内通过`mapActions`获取`getData`方法并调用它来获取数据: ```javascript <template> <button @click="getData">Get Data</button> </template> <script> import { mapActions } from 'vuex'; export default { methods: { getData() { this.$store.dispatch('getData'); } }, computed: { // 如果你想直接在模板中显示数据,可以在这里计算 ...mapActions(['getData']) } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值