uniapp renderjs 逻辑层,视图层互相传递数据封装

uniapp renderjs 逻辑层,视图层互相传递数据封装

<template>
    <view class="content">
        <view :prop="sender" :change:prop="renderMaps.handleAction">
            <button @click="renderMaps.viewInit">向逻辑层发送数据</button>
            <button @click="luoInif">向视图层发送数据</button>
            <button @click="luojiFn">触发逻辑层的方法</button>
        </view>
    </view>
</template>
<!-- 逻辑层 -->
<script>
export default {
    data() {
        return {
            sender: {
                handle: "", //调用视图层方法的名字
                callback: "", //回调函数的名字
                options: null, //传递给视图层的数据
                rendCallback: "", //视图层的回调函数的名字(可选)暂时无用
            },
        }
    },
    created() {
        console.log(1)
        // 逻辑层向视图层传递数据
        this.sendMsg("init", "handleFeaturePopup", { id: 10 }, (e) => {
            console.log("视图层回调函数执行了,可以在这里做一些逻辑处理", e)
        })
    },
    mounted() {
        console.log(2)
    },
    methods: {
        /**
         * 视图层触发逻辑层方法 类似子传父
         * @param event callback 逻辑层的方法名称
         * @param event param 传递给逻辑层的数据
         */
        handleItemClick(event) {
            const handle = this[event.callback]
            handle && handle(event.param)
        },
        /**
         * 逻辑层传递数据到视图层 类似父传子
         *
         * @param handle 触发视图层的方法名称
         * @param callback 逻辑层的方法名称
         * @param options 消息发送的配置选项
         * @param rendCallback 逻辑层的回调函数(可选)暂时无用
         */
        sendMsg(handle, callback, options, rendCallback) {
            this.sender = {
                handle,
                callback,
                options,
                rendCallback,
            }
        },

        handleFeaturePopup(options) {
            console.log("options:", options)
            console.log("逻辑层接受到了数据:", options)
        },
        luoInif() {
            this.sendMsg("init", "handleFeaturePopup", { id: 100 }, (e) => {
                console.log("视图层回调函数执行了,可以在这里做一些逻辑处理", e)
            })
        },
    },
}
</script>
<!-- 视图层 -->
<!-- <script> -->
<script module="renderMaps" lang="renderjs">
let map = null
export default {
    data() {
        return {
            //逻辑层的方法名称
            callback: "",
        }
    },
    mounted() {
        console.log(3)
    },
    created() {
        console.log(4)
    },
    methods: {
        /**
        * 监听逻辑层传递过来的数据
			 * @param {*} newValue 新的值或状态
			 * @param {*} oldValue 旧的值或状态
			 * @param {*} ownerInstance 拥有该数据或组件的实例
			 * @param {*} instance 当前操作的具体实例
			 */
        handleAction(newValue, oldValue, ownerInstance, instance) {
            console.log("逻辑层传递过来的数据", newValue)
            const handle = this[newValue.handle]
            let options = newValue.options
            //保存逻辑层的方法名称
            this.callback = newValue.callback
            if (!options) {
                options = undefined
            }
            if (!handle) {
                console.info("参数为标记需要执行的方法")
                return
            }
            handle(options, newValue?.rendCallback)
        },
        init(options, fn) {
            console.log("视图层接受到数据了")
            // 回调
            fn("11")
        },
        viewInit() {
            console.log("视图层向逻辑层发送数据-------------------------------------------")
            this.$ownerInstance.callMethod("handleItemClick", {
                callback: "handleFeaturePopup",
                param: {
                    name: "李四",
                    age:11,
                },
            })
        },
        luojiFn(){
            console.log("this.callback:",this.callback);
             this.$ownerInstance.callMethod("handleItemClick", {
                callback: this.callback,
                param: {
                    name: "李四11",
                    age:11,
                },
            })
        }
    },
}
</script>
<style lang="scss" scoped></style>

UniApp 中使用 `renderjs` 时,逻辑层调用视图层方法并传递参数,主要依赖于数据绑定和自定义事件的机制。通过绑定属性和监听属性变化,可以实现从逻辑层视图层传递数据,并触发视图层的方法。 ### 逻辑层视图层传递参数并调用方法 #### 方法一:利用属性绑定和 `change:prop` 监听触发视图层方法 1. **模板中绑定属性并监听变化** 在 `template` 中绑定一个属性(如 `prop`),并通过 `change:prop` 监听该属性的变化,当属性发生变化时,触发视图层的函数。 ```html <template> <view> <view id="echarts" :prop="message" :change:prop="echarts.getMessage"></view> <button @click="click">按钮</button> </view> </template> ``` 2. **逻辑层设置数据** 在逻辑层的 `data` 中定义 `message`,并在 `click` 方法中修改其值,从而触发视图层的 `getMessage` 方法。 ```javascript <script> export default { data() { return { message: '首次传递数据' }; }, methods: { click() { this.message = "再发一次数据"; } } }; </script> ``` 3. **视图层接收数据并执行逻辑** 在 `renderjs` 中定义 `getMessage` 方法,用于接收逻辑层传递的值,并执行相关操作。 ```javascript <script module="echarts" lang="renderjs"> export default { methods: { getMessage(newValue) { console.log(newValue); // 输出逻辑层传递的数据 } } }; </script> ``` 此方法利用了 `prop` 的双向绑定机制,通过 `change:prop` 监听属性变化,从而触发视图层的方法[^3]。 --- #### 方法二:通过自定义方法调用视图层函数 1. **视图层定义方法** 在 `renderjs` 中定义一个方法,例如 `toggleRenderType`,用于接收逻辑层传递的参数并执行操作。 ```javascript <script module="renderModule" lang="renderjs"> export default { methods: { toggleRenderType(newVal, oldVal) { console.log('收到新指令:', newVal); this.loadPDF(newVal); }, loadPDF(url) { console.log('处理逻辑...', url); } } }; </script> ``` 2. **逻辑层触发视图层方法** 在逻辑层通过修改绑定的属性值(如 `toggleTypeNum`),触发视图层的 `toggleRenderType` 方法。 ```html <div class="right_operation_btns" :toggleTypeNum="toggleTypeNum" :change:toggleTypeNum="renderModule.toggleRenderType"></div> ``` ```javascript <script> export default { data() { return { toggleTypeNum: 1 // 初始值 }; }, onLoad(option) { this.toggleTypeNum = option.serverUrl; // 修改值,触发视图层方法 } }; </script> ``` 当 `toggleTypeNum` 发生变化时,会自动调用视图层的 `toggleRenderType` 方法,并将新值和旧值作为参数传递过去[^1]。 --- #### 方法三:通过 `$ownerInstance` 主动调用逻辑层方法 虽然此方法主要用于视图层逻辑层通信,但在某些场景下,逻辑层可以通过 `renderjs` 模块的 `this.$ownerInstance` 调用逻辑层的方法,实现双向通信。 1. **视图层定义方法并调用逻辑层函数** ```javascript <script module="renderModule" lang="renderjs"> export default { methods: { renderPage() { const that = this; this.$ownerInstance.callMethod('receiveNowPages', that.nowNumPage); } } }; </script> ``` 2. **逻辑层定义接收函数** ```javascript <script> export default { data() { return { nowPage: 0 }; }, methods: { receiveNowPages(num) { this.nowPage = num; } } }; </script> ``` 视图层通过 `this.$ownerInstance.callMethod` 调用逻辑层定义的方法,并传递参数。 --- ### 总结 在 UniApp 中使用 `renderjs` 时,逻辑层调用视图层方法并传递参数,可以通过以下方式实现: - **利用属性绑定和 `change:prop` 监听**,实现数据变化触发视图层方法。 - **直接修改绑定的属性值**,触发视图层的响应函数。 - **使用 `$ownerInstance.callMethod`**,实现视图层逻辑层通信。 这些方法结合了 MVVM 模式中的数据绑定机制,使得逻辑层视图层之间的通信更加高效和清晰[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vue1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值