uni-app 使用this动态传参赋值问题

本文详细介绍了在uni-app开发中,如何正确处理请求回调中的this指向问题,避免因闭包导致的数据无法正常更新。通过使用let that=this或箭头函数的方式,确保this.token能正确赋值。

先上一段代码:

    export default {
        data() {
            return {
                token:''
            }
        }

}

 let that=this

    uni.request({
                    url:this.$BaseUrl+'/CompanyController/establishToken',
                    methods:'POST',
                    header:{
                    'Content-type':'application/x-www-form-urlencoded'
                    },
                    dataType:"json",
                    success:funtion(){
                       // this.token=res.data.token;

                      that.token=res.data.token;
                    }
                })

这个代码中使用普通的success:funtion(){} 经常用普通函数 因此我们使用this.token赋值的时候出现怎么都赋不上值因为

uni.request 中uccess方法指向闭包,所以this属于闭包,由此在success回调函数里是不能直接使用this.tokne的 可以在方法外使用let that=this的方法 that.token=res.data.token ;

当然还有另外一种方法使用使用箭头函数直接使用this指向就可以

    uni.request({
                    url:this.$BaseUrl+'/CompanyController/establishToken',
                    methods:'POST',
                    header:{
                    'Content-type':'application/x-www-form-urlencoded'
                    },
                    dataType:"json",
                    success:(res)=>{
                        this.token=res.data.token;
                    }
                })

  各位小姐姐,小哥哥 小编如果能够给各位解决问题,留下爱心,足迹哦

 

 

<think> 我们已经在之前的回答中详细说明了在uni-app小程序的Vue环境中给指定页面指定text控件赋值的方法。结合用户当前的需求和提供的引用内容,我们将进一步整理和补充。 根据用户的问题,核心需求是给指定页面的指定text控件赋值。需要注意的是,uni-app基于Vue.js,因此数据绑定遵循Vue的响应式原则。同时,要考虑uni-app的特殊性(如页面生命周期、跨页面通信等)。 ### 方法总结(基于之前回答和引用内容) #### 1. **同一页面内赋值(直接数据绑定)** 在同一个Vue文件(页面)中,通过`v-model`或`:value`绑定数据,然后在方法中修改数据即可。 ```vue <template> <view> <input type="text" v-model="textValue" /> </view> </template> <script> export default { data() { return { textValue: '' // 初始值 }; }, methods: { // 赋值方法 setTextValue(value) { this.textValue = value; // 直接赋值,响应式更新 } } }; </script> ``` #### 2. **跨页面赋值** **方法一:URL参数传递(适合简单数据)** - 在跳转时通过URL传递参数: ```javascript // 页面A跳转到页面B并传递参数 uni.navigateTo({ url: '/pages/pageB?textValue=' + encodeURIComponent('要传递的值') }); ``` - 在页面B的`onLoad`生命周期中获取参数并赋值: ```javascript // 页面B export default { data() { return { textValue: '' }; }, onLoad(options) { if (options.textValue) { this.textValue = decodeURIComponent(options.textValue); } } }; ``` **方法二:全局状态管理(Vuex,适合复杂数据或频繁更新)** - 在store中定义状态和修改方法(以Vuex为例): ```javascript // store/index.js export default { state: { textValue: '' }, mutations: { setTextValue(state, value) { state.textValue = value; } } }; ``` - 在页面A中提交mutation修改状态: ```javascript // 页面A this.$store.commit('setTextValue', '全局赋值'); ``` - 在页面B中通过计算属性获取状态值: ```vue // 页面B <template> <input type="text" :value="textValue" /> </template> <script> import { mapState } from 'vuex'; export default { computed: { ...mapState(['textValue']) } }; </script> ``` **方法三:事件总线(Event Bus)** - 在`main.js`中创建事件总线: ```javascript Vue.prototype.$eventBus = new Vue(); ``` - 在页面A中发送事件: ```javascript // 页面A this.$eventBus.$emit('updateText', '事件总线传递的值'); ``` - 在页面B中监听事件(注意在适当时机移除监听): ```javascript // 页面B export default { data() { return { textValue: '' }; }, created() { this.$eventBus.$on('updateText', (value) => { this.textValue = value; }); }, beforeDestroy() { this.$eventBus.$off('updateText'); } }; ``` #### 3. **通过`web-view`组件传递数据(特殊场景)** 引用[2]中提到了H5页面与小程序之间的通信,使用`uni.$emit`和`uni.$on`。但注意这种方式适用于H5页面内嵌在小程序中(通过`web-view`组件)的情况。如果涉及H5页面和小程序页面的数据传递,可以参考: - 在H5页面中触发事件传递数据: ```javascript // 在H5页面(内嵌在web-view中) uni.$emit('tempImg', { imgPrams: "222" }); ``` - 在小程序页面中监听事件并更新数据: ```javascript // 小程序页面 onLoad() { uni.$on('tempImg', (res) => { this.textValue = res.imgPrams; // 更新text控件的值 }); }, onUnload() { uni.$off('tempImg'); // 移除监听 } ``` ### 注意事项 1. **响应式赋值**:在Vue中,直接对data中定义的属性赋值即可触发视图更新,无需使用小程序的`setData`方法。 2. **数据类型**:传递复杂数据(如对象、数组)时,使用全局状态管理(Vuex)或事件总线更合适。 3. **页面销毁**:使用事件总线时,务必在页面销毁前移除事件监听,避免内存泄漏(引用[2]中提到了`onUnload`)。 4. **原生组件限制**:如果需要覆盖原生组件(如`textarea`),注意使用`cover-view`(引用[3]),但赋值方法不受影响。 ### 最佳实践建议 - **简单数据传递**:优先使用URL参数。 - **跨页面共享数据**:使用Vuex。 - **组件间或页面间解耦通信**:使用事件总线。 §§相关问题§§ 1. 如何避免 uni-app 中小程序页面通信导致的内存泄漏? 2. Vuex 在 uni-app 中的持久化存储如何实现? 3. 如何监听 uni-app 页面返回事件并刷新数据? 4. uni-app 中 `web-view` 组件与H5页面通信的完整流程是怎样的? [^1]: uni-app官方预设模板 [^2]: web-view与小程序页面通信方法 [^3]: 原生组件覆盖注意事项 [^4]: 第三方组件样式引入方式 </think> 在 uni-app 小程序的 Vue 环境中,给指定页面的指定 text 控件赋值需遵循 Vue 响应式原则和 uni-app 页面通信机制。以下是具体实现方法: ### 一、同页面内赋值(直接数据绑定) ```vue <template> <!-- 指定text控件 --> <input type="text" v-model="myTextValue" /> </template> <script> export default { data() { return { myTextValue: "" // 绑定的数据属性 } }, methods: { setTextValue() { // 直接修改数据属性(自动更新视图) this.myTextValue = "新赋值内容"; } } } </script> ``` ### 二、跨页面赋值方案 #### 方法1:URL 参数传递(简单数据) ```javascript // 源页面跳转时传参 uni.navigateTo({ url: `/pages/targetPage?textValue=${encodeURIComponent("传递的值")}` }); // 目标页面接收(onLoad生命周期) onLoad(options) { if(options.textValue) { this.myTextValue = decodeURIComponent(options.textValue); } } ``` #### 方法2:全局事件总线(任意页面通信) ```javascript // main.js 注册全局事件总线 Vue.prototype.$eventBus = new Vue(); // 源页面发送事件 this.$eventBus.$emit("updateText", "新内容"); // 目标页面监听事件 export default { created() { this.$eventBus.$on("updateText", (value) => { this.myTextValue = value; // 接收赋值 }); }, beforeDestroy() { this.$eventBus.$off("updateText"); // 销毁监听[^2] } } ``` #### 方法3:Vuex 状态管理(复杂场景) ```javascript // store/index.js export default { state: { textValue: "" }, mutations: { setText(state, value) { state.textValue = value; // 全局状态更新 } } } // 源页面提交修改 this.$store.commit("setText", "全局赋值"); // 目标页面获取值 computed: { myTextValue() { return this.$store.state.textValue; // 自动响应更新 } } ``` ### 三、特殊场景:通过 web-view 传递数据 ```vue <!-- H5页面内触发 --> <script> uni.$emit("tempData", { content: "H5传递的值" }); uni.navigateBack(); // 返回小程序页面 </script> <!-- 小程序页面接收 --> <script> onLoad() { uni.$on("tempData", (res) => { this.myTextValue = res.content; // 接收H5数据 }); }, onUnload() { uni.$off("tempData"); // 销毁监听[^2] } </script> ``` ### 注意事项 1. **响应式原则** 直接修改 `data` 中定义的属性(`this.myTextValue = ""`),不要使用小程序原生 `setData` 2. **避免覆盖原生组件** 若 text 控件在原生组件(map/video)上层,需使用 `<cover-view>` 而非普通 view[^3] 3. **样式问题处理** 第三方组件需手动引入样式(如 quill 编辑器)[^4]: ```css /* App.vue */ @import '@/styles/quill/quill.core.css'; ``` 4. **内存泄漏预防** 事件监听必须在 `onUnload`/`beforeDestroy` 生命周期解绑[^2] ### 最佳实践推荐场景 | 场景 | 推荐方案 | 数据量限制 | |--------------------|-------------------|------------| | 简单页面跳转 | URL 参数传递 | 2KB以下 | | 高频数据更新 | Vuex 状态管理 | 无限制 | | 跨页面实时通信 | 全局事件总线 | 中等 | | H5 与小程序交互 | uni.$emit/$on | 128KB以下 |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值