关于自定义的data-*属性有时候取不到值的问题

本文探讨了H5自定义属性data-*在实际应用中的一个特殊案例。作者发现部分data-*属性通过this.dataset方式无法正确获取值,而使用jQuery的$(this).attr()方法则可以成功获取所有属性值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天试了一下H5里面的自定义属性 data-* 方法,碰到一个比较奇怪的问题,那就是我的自定义属性有的能取到值,有的取不到

首先给大家看一下我定义 data-* 属性的代码

<li id="a" data-testid="123456" data-testname="name1" data-testtime="1111" data-testcount="11" >

在代码的另一个地方我需要用到这几个属性的值

于是我在这个 li 标签的点击事件中用来这种写法

this.dataset.count

前几个  testid,testname,testtime 都可以取到值,但是最后一个 testcount 就是取不到,得到的结果是 undefined

于是我改用了下面这种方式

jQuery 是必须的

然后

$(this).attr("data-testcount")

测试,可以取到值了












<think>好的,我现在需要帮助用户解决在Vue.js中自定义v-model的file-list问题。首先,我要回忆一下Vue.js中v-model的工作原理。v-model本质上是一个语法糖,它结合了value属性和input事件的监听。默认情况下,v-model会绑定组件的value属性,并在input事件触发时更新数据。 但用户提到的是自定义file-list的,这可能涉及到文件上传组件,比如使用Element UI的el-upload组件,它通常使用file-list属性来绑定上传的文件列表。这时候用户可能想要通过v-model来双向绑定这个file-list,而不是使用单独的prop和事件。 根据Vue的文档,如果需要自定义v-model绑定的属性和事件,可以在子组件中定义model选项。例如,指定prop为fileList,事件为change。这样父组件使用v-model时,实际上绑定的就是fileList属性,并在change事件发生时更新。 接下来,我需要考虑如何在子组件中正确设置model选项。子组件应该接收fileList作为prop,然后在文件列表变化时触发change事件,并传递新的。这样父组件通过v-model就能双向绑定fileList了。 另外,用户可能在使用第三方组件如el-upload时遇到问题,因为这些组件可能有自己的prop和事件。这时候需要确保在子组件中正确地将file-list和事件(如update:file-list)暴露出来,以便在父组件中使用v-model绑定。 还有一个需要注意的地方是,Vue 2和Vue 3在自定义v-model上有所不同。Vue 2默认使用value和input,而Vue 3可以使用多个v-model绑定,并且默认使用modelValue和update:modelValue。但用户的问题可能集中在Vue 2,因为引用的资料提到了Vue.set方法,这在Vue 2中常见。 可能还需要提到使用.sync修饰符,这在Vue 2中用于双向绑定多个prop,但在Vue 3中已被v-model的参数所代。不过用户的问题主要在于自定义单个v-model,所以重点还是放在model选项上。 最后,我应该给出一个具体的示例,展示子组件如何定义model选项,以及父组件如何使用v-model绑定fileList。同时提醒用户注意在更新文件列表时使用Vue.set或数组的变异方法,以确保响应式更新,特别是在Vue 2中,直接修改数组可能不会触发视图更新。 总结步骤: 1. 在子组件中使用model选项指定prop和事件。 2. 在子组件中通过watch或事件监听文件列表的变化,触发相应的事件。 3. 父组件使用v-model绑定fileList。 4. 处理文件更新时确保响应式系统的检测,可能需要使用Vue.set或替换整个数组。</think>在Vue.js中自定义组件的$v-model$绑定$file-list$,需通过以下步骤实现: ### 一、组件双向绑定原理 Vue的$v-model$本质是语法糖,默认绑定组件的$value$属性和$input$事件[^1]。对于文件列表等特殊场景,需通过$model$配置项自定义绑定属性: ```javascript // 子组件配置 export default { model: { prop: 'fileList', // 指定绑定的属性名 event: 'change' // 指定触发事件 }, props: { fileList: { // 声明接收的prop type: Array, default: () => [] } } } ``` ### 二、文件列表更新实现 在文件上传组件中,需要监听文件变化并触发更新事件: ```javascript // 子组件方法 methods: { handleFileChange(newFiles) { this.$emit('change', [...this.fileList, ...newFiles]) // 触发事件更新 } } ``` ### 三、父组件使用示例 ```html <!-- 父组件模板 --> <file-uploader v-model="currentFileList"></file-uploader> ``` ### 四、响应式更新注意事项 当操作数组时,应使用下列方法保证响应性: ```javascript // 正确方式 this.$set(this.fileList, index, newFile) // 或 this.fileList = [...this.fileList, newFile] ``` ### 五、第三方组件封装示例(以Element UI为例) ```html <template> <el-upload :file-list="innerFileList" @change="handleChange"> </el-upload> </template> <script> export default { model: { prop: 'fileList', event: 'update' }, props: ['fileList'], data() { return { innerFileList: [...this.fileList] } }, watch: { fileList(newVal) { this.innerFileList = [...newVal] } }, methods: { handleChange(file, fileList) { this.$emit('update', [...fileList]) } } } </script> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值