A · ### 解答思路 Props 的数据类型决定了直接修改的实际后果不同:基本类型(字符串、数字、布尔等)修改后仅影响子组件本地的这份拷贝,父组件的数据不会变,因此“修改也没用”;引用类型(对象、数组)由于共享同一份内存引用,修改会直接影响到父组件的数据,看似“有效”,但会破坏组件间的单向数据流,导致数据流向变得不清晰、难
A · ### 解答思路 两者的核心区别在于 `this` 的确定时机:箭头函数的 `this` 在**定义**时就已经确定,继承自外层作用域;普通函数的 `this` 则要等到**调用**时,根据调用方式动态确定。 ### 示例代码 ```js // 普通 function 形式的 IIFE:this 由调用方式决定 (as
A · ### 解答思路 问题的关键在于区分清楚访问 `$refs` 时到底用的是「字面量属性名」还是「变量值作为属性名」,这三种写法在 JS 语法层面含义完全不同,只有正确地把变量作为动态键去访问,才能取到通过动态 `ref` 绑定注册的实例。 ### 示例代码 ```js this.$refs.label.focus();
A · ### 解答思路 问题的根源不是 `v-model`,而是新 push 进数组的对象里根本没有 `price` 字段,并且直接 push 了原始对象的引用,导致数据被意外污染。 ### 示例代码 ```js selectChange(item) { // 错误写法:直接 push 原对象引用,且缺少 price 字段
A · ### 解答思路 遍历 `obj2` 自身的键,用同名键去 `obj1` 中取值,逐一赋值覆盖即可。 ### 示例代码 ```js const obj1 = { a: 1, b: 2, c: 3, d: 4 }; const obj2 = { b: 0, c: 0 }; Object.keys(obj2).forEac
A · ### 解答思路 `<a href="...">` 发起的是浏览器原生请求,无法附加自定义请求头。如果后端要求必须通过请求头传递 token,就不能直接用 `<a>` 标签下载,而要先用 AJAX/`fetch` 携带请求头去请求资源,拿到二进制数据(`Blob`)后再触发下载。 ### 示例代码 ```js asyn
A · ### 解答思路 先理清引用关系:`const frame = window.open(url)` 中,`frame` 是**打开者**(原窗口)持有的**新窗口的引用**;而在**新窗口**内部,`window.opener` 则是指向**打开它的那个原窗口**的引用。有了双向引用后,就可以通过 `postMessa
A · ### 解答思路 生成唯一选择器常见的两类思路: 1. **基于已有特征拼接**:递归读取元素的 `id`、`class`、`tagName`、在父节点中的索引等信息,逐层拼接出一条能唯一定位该元素的选择器路径。 2. **主动打标记(更省心的取巧方案)**:直接给目标元素临时打上一个全局唯一的自定义属性(如 `dat
A · ### 解答思路 浏览器本身无法直接读取用户的公网 IP,只能通过向服务器发起一次请求,由服务器读取请求的来源 IP 并返回给前端,从而间接获取出口 IP。 ### 详细说明 - 前端在 Vue 组件中发起一个普通的 HTTP 请求(比如请求自己搭建的服务),服务端根据请求头(如 `X-Forwarded-For`、`
A · ### 解答思路 节点折叠的点击事件很可能绑定在原生 DOM 事件上,通过给 `radio`/`checkbox` 添加 `@click.native.stop` 阻止事件冒泡到父级节点,是最直接的处理方式;如果组件内部通过 `$emit` 触发折叠逻辑而非依赖原生事件冒泡,则需要针对原始事件本身来阻止冒泡。 ###