声明map时直接赋值,需要注意的地方

func main() {

    // map的第一种方式:

    var a map[string]string

    a = make(map[string]string, 10)

    a["No1"] = "宋江"

    a["No2"] = "吴用"

    a["No3"] = "武松"

    // a["No3"] = "吴用"

    a["No4"] = "黄飞鸿"

    fmt.Println(a)

 

    // map的第二种方式:

    cities := make(map[string]string)

    cities["No1"] = "北京"

    cities["No2"] = "上海"

    cities["No3"] = "广州"

    cities["No4"] = "深圳"

    fmt.Println(cities)

 

    // map的第三种方式:

    var heroes map[string]string = map[string]string{

        "heroes": "宋江",

        // "heroes": "卢俊义", 使用这种写法时,key键不能重复

        "heroes02": "卢俊义",

    }

    fmt.Println(heroes)

    heroes2 := map[string]string{

        "heroes1": "宋江",

        "heroes2": "卢俊义",

        "heroes3": "林冲",

        // "heroes3": "林聪", 使用这种写法时,key键不能重复

    }

    heroes2["heroes4"] = "吴用"

    fmt.Println(heroes2)

}

<think>我们正在讨论Reactive编程中的赋值方法。根据引用[1]和[2],我们知道在Vue的Composition API中,有两种创建响应式数据的方法:ref和reactive。引用[1]给出了一个简单的类比:`const num = ref(0)`类似于`let num = 0`,而`const obj = reactive({age:10})`类似于`let obj = {age:10}`。引用[2]则强调了响应式编程在数据变化自动更新UI的能力,提出了ref和reactive的异同问题。 用户的问题是想了解Reactive赋值方法在编程中的使用。因此,我们将重点介绍reactive的使用方法,与ref进行适当对比。 ### 1. reactive的基本使用 `reactive`是Vue 3中用于创建响应式对象的方法。它接收一个普通对象,返回该对象的响应式代理。响应式转换是“深层”的,即它会影响到所有嵌套的属性。 示例: ```javascript import { reactive } from 'vue'; // 创建一个响应式对象 const state = reactive({ count: 0, user: { name: 'John', age: 25 } }); // 修改属性 state.count = 1; // 响应式更新 state.user.age = 26; // 嵌套属性也是响应式的 ``` ### 2. reactive与ref的区别 - `reactive`用于对象(包括数组、Map、Set等集合类型),而`ref`可以用于任何类型的值(包括基本类型和对象)。 - `ref`在访问和修改需要加上`.value`,而`reactive`包裹的对象可以直接访问属性。 - 当使用`ref`来包裹一个对象,实际上内部会调用`reactive`来使对象具有响应性。 示例对比: ```javascript import { ref, reactive } from 'vue'; // 使用ref const countRef = ref(0); console.log(countRef.value); // 0 countRef.value = 1; // 修改 // 使用reactive const state = reactive({ count: 0 }); console.log(state.count); // 0 state.count = 1; // 修改 ``` ### 3. 使用reactive进行赋值注意事项 直接给`reactive`创建的响应式对象整体赋值会失去响应性。这是因为`reactive`返回的是对原始对象的代理,而新赋值的对象不是响应式的。 错误示例: ```javascript let state = reactive({ count: 0 }); // 错误的赋值方式 state = { count: 1 }; // 失去响应性 ``` 正确做法: - 如果需要整体替换对象,可以使用`Object.assign`来合属性,保持原对象的引用: ```javascript const state = reactive({ count: 0 }); // 正确:通过合属性来更新 Object.assign(state, { count: 1, newProp: 'hello' }); ``` - 或者使用`ref`来包裹对象,这样整体替换不会丢失响应性(因为替换的是`.value`): ```javascript const stateRef = ref({ count: 0 }); stateRef.value = { count: 1 }; // 响应式更新 ``` ### 4. 在模板中使用reactive 在模板中可以直接访问响应式对象的属性,不需要`.value`。 ```vue <template> <div> <p>Count: {{ state.count }}</p> <p>User: {{ state.user.name }}, Age: {{ state.user.age }}</p> </div> </template> <script setup> import { reactive } from 'vue'; const state = reactive({ count: 0, user: { name: 'John', age: 25 } }); </script> ``` ### 5. 在组合式函数中使用reactive 在组合式函数中,我们可以返回`reactive`对象,以便在多个地方使用。 ```javascript // 组合式函数 export function useUser() { const user = reactive({ name: '', age: 0 }); function updateUser(newUser) { Object.assign(user, newUser); } return { user, updateUser }; } ``` 然后在组件中使用: ```vue <script setup> import { useUser } from './useUser'; const { user, updateUser } = useUser(); // 更新用户信息 updateUser({ name: 'Alice', age: 30 }); </script> ``` ### 总结 在Vue 3的响应式编程中,`reactive`用于创建响应式对象,适合处理对象类型的数据。赋值注意保持对象的引用,避免直接替换整个对象。对于基本类型或需要整体替换对象的情况,可以考虑使用`ref`。 §§相关问题§§ 1. 在Vue 3中,reactive和ref在性能上有何差异? 2. 如何避免reactive对象失去响应性? 3. reactive和ref在TypeScript中的类型定义有何不同? 4. 在Vue 2中如何实现类似reactive的功能?</think>### Reactive赋值方法在编程中的使用 Reactive编程是一种声明式的编程范式,核心思想是通过数据流的变化自动驱动程序行为。在响应式编程中,赋值操作与传统命令式编程有显著区别,主要通过**数据流订阅**和**自动传播变更**来实现。以下是具体使用方法: --- #### 1. **基本赋值模式** 在响应式系统中,赋值不是直接修改变量,而是通过**可观察对象(Observable)** 和**订阅者(Subscriber)** 的机制实现: ```javascript // Vue 3 示例 (Composition API) import { reactive } from 'vue'; // 创建响应式对象 const user = reactive({ name: '张三', age: 25 }); // 响应式赋值(自动触发依赖更新) user.age = 26; // UI中所有使用age的位置自动更新 ``` > 说明:`reactive()` 将普通对象转换为响应式代理,属性赋值会触发依赖追踪[^2]。 --- #### 2. **深层嵌套对象的赋值** 响应式系统支持嵌套对象的自动代理: ```javascript const state = reactive({ profile: { address: { city: '北京' } } }); // 深层次赋值仍可触发响应 state.profile.address.city = '上海'; // 自动更新 ``` --- #### 3. **数组的响应式赋值** 处理数组需使用不会破坏响应性的方法: ```javascript const list = reactive([1, 2, 3]); // ✅ 正确方式 (保留响应性) list.push(4); list.splice(0, 1, 99); // ❌ 错误方式 (丢失响应性) list = [4, 5, 6]; // 直接替换整个数组 ``` --- #### 4. **与 `ref()` 的对比使用** | **特性** | `reactive()` | `ref()` | |----------------|----------------------------------|----------------------------------| | 适用对象 | 对象/Map/Set 等复杂结构 | 基本类型(数字/字符串)或对象引用 | | 赋值语法 | 直接访问属性 (`obj.key`) | 需`.value` (`refObj.value`) | | 解构响应性 | 丢失响应性 (需`toRefs`) | 保持响应性 | | 典型用例 | 表单对象/嵌套数据 | 基础状态/模板引用 | ```javascript // ref 示例 import { ref } from 'vue'; const count = ref(0); count.value++; // 通过.value赋值 ``` --- #### 5. **框架中的具体实现** - **Vue 3**:基于Proxy实现响应式赋值 ```javascript // 自动依赖收集 watchEffect(() => { console.log(user.age); // 当age变化自动执行 }); ``` - **React (useState)**:通过setter函数赋值 ```jsx const [count, setCount] = useState(0); setCount(prev => prev + 1); // 函数式赋值 ``` - **Spring WebFlux**:响应式流赋值 ```java Mono<String> data = Mono.just("Hello") .map(value -> value + " Reactive!"); // 流式操作 ``` --- #### 6. **最佳实践与注意事项** 1. **避免直接替换对象** ```javascript // ❌ 错误 state = { new: "object" }; // ✅ 正确 Object.assign(state, { new: "object" }); ``` 2. **使用 `toRefs` 解构属性** ```javascript const { age } = toRefs(user); // 保持响应性的解构 age.value = 30; ``` 3. **异步赋值需额外处理** 在异步操作中赋值,需确保执行上下文正确(如Vue的`nextTick`)。 > 核心原理:响应式赋值本质是**发布-订阅模式**的实现,赋值操作触发notify,通知所有订阅者更新[^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值