Vue获取input的数据(ref/v-model)~VUE学习笔记

初学VUE之数据获取

初学VUE,仅供参考,有不足之处还请指出,谢谢*

Vue通过ref获取input数据
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="textOl">
			<ol>
				<li v-for="message in todos">
					{{message.text}}
				</li>
			</ol>
			<input type="text" ref="textname">
			<button v-on:click="reverBut">添加项目</button>
		</div>
		<script type="text/javascript">
			var testol=new Vue({
				el:'#textOl',
				data:{
					todos:[
						{text:'HTML5'},
						{text:'CSS'},
						{text:'Vue'}
					]
				},
				methods:{
					reverBut:function(){
						this.todos.push({text:this.$refs.textname.value})
					}
				}
			})
		</script>
		
	</body>
</html>

注 input ref值

<input type="text" ref="textname" id="name">

获取

this.$refs.textname.value

和JQuery不同的是,JQury通常通过id获取对应节点获取值。
例:

$('name').val()

注意,一个是通过ref,一个是id

Vue通过v-model获取input数据
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="vue.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div id="textOl">
			<ol>
				<li v-for="message in todos">
					{{message.text}}
				</li>
			</ol>
			<input type="text"  v-model="messages">
			<button v-on:click="reverBut">添加项目</button>
		</div>
		<script type="text/javascript">
			var testol=new Vue({
				el:'#textOl',
				data:{
					todos:[
						{text:'HTML5'},
						{text:'CSS'},
						{text:'Vue'}
					],
					messages:''
				},
				methods:{
					reverBut:function(){
						this.todos.push({text:this.messages})
					}
				}
			})
		</script>
		
	</body>
</html>
``
<think>我们正在使用Vant组件库,需求是:当变量show为true时,阻止用户修改radio或checkbox的选项,并弹窗提示。 根据引用,我们知道Vant提供了van-dialog组件用于弹窗,同时van-checkbox-group和van-radio-group分别用于复选框和单选框。 思路: 1. 我们需要在用户尝试修改选项时进行条件判断(根据show的值)。 2. 如果show为true,则阻止默认的修改行为(即不让选项改变),并弹出对话框提示用户。 具体实现: 对于复选框(van-checkbox-group): - 我们可以监听change事件,当选项改变时触发。 - 在change事件处理函数中,判断show的值。如果show为true,则不更新选中值(即保持原来的选中状态),并弹出对话框。 对于单选框(van-radio-group): - 同样监听change事件,处理方式类似。 但是注意:Vant的复选框组和单选框组都是受控组件,我们需要通过v-model绑定选中的值。因此,在条件满足时,我们不改变绑定的值,即可阻止选项的修改。 步骤: 1. 在data中定义需要绑定的变量,如checkedGroup(复选框)和radioValue(单选框)。 2. 为复选框组和单选框组分别绑定change事件。 3. 在change事件中,判断show的值。如果show为true,则弹出对话框(使用van-dialog),并且不更新绑定的值(即保持原值);否则,正常更新绑定的值。 然而,由于v-model是双向绑定,我们无法在事件中直接阻止值的改变(因为v-model会同步更新)。因此,我们可以采用以下方法: - 不使用v-model,而是使用:value绑定值,然后通过@change事件来手动更新值。这样我们就可以在事件中控制是否更新值。 另一种方法是:使用计算属性的setter,但这里我们采用事件处理的方式更直接。 具体代码结构示例(以复选框为例): 假设我们有一个复选框组: <van-checkbox-group :value="checkedGroup" @change="onChangeCheckbox"> <van-checkbox ... /> </van-checkbox-group> 在methods中: onChangeCheckbox(value) { if (this.show) { // 弹出提示框 this.$dialog.alert({ message: '当前不可修改选项' }); // 注意:这里我们不更新checkedGroup,所以视图上会保持原来的值 // 但是,由于我们使用的是:value而不是v-model,所以需要手动更新checkedGroup的情况是在允许修改时 // 因此,我们只在允许修改时更新checkedGroup return; } // 如果允许修改,则更新checkedGroup this.checkedGroup = value; } 但是,如果我们之前使用的是v-model,那么v-model相当于同时绑定了:value和@input。因此,我们无法在@change事件中阻止值的更新,因为@input已经更新了值。 因此,我们需要将v-model拆开: 原v-model="checkedGroup" 改为 :value="checkedGroup" 和 @input="onChangeCheckbox" 注意:Vant的复选框组change事件对应的是@change,但是实际上v-model的内部实现是@input?我们需要查看Vant文档。 根据Vant文档,van-checkbox-group的change事件返回的是当前选中的值,我们可以使用@change事件,同时使用:value绑定,这样我们就可以控制是否更新checkedGroup。 但是,Vant的checkbox-group也支持v-model,其原理是:v-model会监听input事件来更新值。而van-checkbox-group在内部选项变化时触发的是change事件,同时也会触发input事件(用于v-model)。所以,如果我们使用v-model,那么当用户点击时,checkedGroup会立即更新,然后我们才在change事件中判断,这时候已经晚了。 因此,我们需要放弃使用v-model,而是使用:value和@change(或@input)来手动控制。 建议做法(复选框): <van-checkbox-group :value="checkedGroup" @change="handleCheckboxChange"> handleCheckboxChange(value) { if (this.show) { this.$dialog.alert({ message: '当前不可修改' }); // 不更新checkedGroup,所以视图不会变 } else { // 允许修改,更新checkedGroup this.checkedGroup = value; } } 这样,当用户点击复选框时,会触发handleCheckboxChange,传入新的值。如果show为true,我们只弹窗,不更新checkedGroup,那么视图就会保持原来的值(因为:value绑定的还是原来的checkedGroup)。 对于单选框组(van-radio-group)也是类似的: <van-radio-group :value="radioValue" @change="handleRadioChange"> ... </van-radio-group> handleRadioChange(value) { if (this.show) { this.$dialog.alert({ message: '当前不可修改' }); } else { this.radioValue = value; } } 弹窗提示:我们可以使用Vant的Dialog组件,这里使用了$dialog.alert,这是Vant提供的函数式调用方式。需要确保已经正确安装和引入了Dialog。 注意:如果项目中没有使用函数式调用,也可以使用组件形式的Dialog,但需要提前在模板中声明,并通过一个变量控制显示。但函数式调用更方便。 总结步骤: 1. 将原本的v-model拆分为:value和@change(或@input,具体看Vant组件的文档,通常复选框组和单选框组都是@change)。 2. 在change事件处理函数中,判断show的值。如果为true,则调用Dialog.alert弹出提示,并且不更新绑定的值;否则,更新绑定的值。 这样,当show为true时,用户试图修改选项,就会弹出提示,并且选项不会改变。 注意:如果用户快速连续点击,可能会弹出多个对话框,我们可以通过设置一个标志位来避免,但一般情况下,Dialog.alert会阻止背景点击,所以问题不大。 代码示例(基于Vue和Vant): 假设我们有一个复选框组和一个单选框组,以及一个控制变量show。 在模板中: <van-checkbox-group :value="checkedGroup" @change="handleCheckboxChange"> <van-checkbox v-for="item in list" :key="item" :name="item">{{ item }}</van-checkbox> </van-checkbox-group> <van-radio-group :value="radioValue" @change="handleRadioChange"> <van-radio v-for="item in list" :key="item" :name="item">{{ item }}</van-radio> </van-radio-group> 在data中: data() { return { show: true, // 当为true时,禁止修改 checkedGroup: [], radioValue: '', list: ['a', 'b', 'c'] }; } 在methods中: handleCheckboxChange(value) { if (this.show) { this.$dialog.alert({ message: '当前禁止修改复选框选项' }); return; } this.checkedGroup = value; }, handleRadioChange(value) { if (this.show) { this.$dialog.alert({ message: '当前禁止修改单选框选项' }); return; } this.radioValue = value; } 这样,当show为true时,用户尝试修改就会弹出提示,并且不会更新选项。 另外,如果我们需要在特定条件下允许修改,只需将show设置为false即可。 注意:以上代码中,我们使用了函数式调用Dialog,需要确保已经全局注册了Dialog组件,或者按需引入了Dialog的函数。 如果没有使用函数式调用,也可以使用组件形式: 在模板中添加: <van-dialog v-model="showDialog" title="提示" message="当前禁止修改" show-cancel-button="false" /> 然后在事件中: if (this.show) { this.showDialog = true; return; } 并在data中定义showDialog: false。 但函数式调用更简洁,不需要额外定义变量。 最后,根据引用[3],我们可以在模板中放置<van-dialog id="van-dialog" />,这样函数式调用才能生效。 因此,确保在模板中(例如App.vue或当前组件)有: <van-dialog id="van-dialog" /> 或者,如果已经全局注册了Dialog,则不需要(因为Vant文档中函数式调用要求这样写)。 综上所述,我们通过拆分v-model为:value和@change,并在事件中根据show变量判断是否允许修改,实现了在禁止修改时弹窗提示的功能。 相关问题: 1. 如何动态控制Vant组件的禁用状态? 2. Vant的Dialog组件有哪些使用方式? 3. 在Vue中如何正确使用Vant的表单组件?</think>要实现在 Vant 组件库中当变量 `show` 为 true 时阻止用户修改 Radio/Checkbox 选项并弹窗提示,可以通过以下步骤实现: ### 解决方案代码 ```vue <template> <!-- 单选框组 --> <van-radio-group v-model="radioValue" :disabled="show" @click="handleRadioClick" > <van-radio name="1">选项1</van-radio> <van-radio name="2">选项2</van-radio> </van-radio-group> <!-- 复选框组 --> <van-checkbox-group v-model="checkedGroup" :disabled="show" @click="handleCheckboxClick" > <van-checkbox name="a">选项A</van-checkbox> <van-checkbox name="b">选项B</van-checkbox> </van-checkbox-group> <!-- 弹窗组件 --> <van-dialog v-model:show="dialogVisible" title="提示" message="当前状态禁止修改选项!" show-cancel-button="false" /> </template> <script setup> import { ref } from 'vue'; const show = ref(true); // 控制是否禁止修改 const radioValue = ref('1'); const checkedGroup = ref(['a']); const dialogVisible = ref(false); // 控制弹窗显示 // 处理单选框点击 const handleRadioClick = () => { if (show.value) { dialogVisible.value = true; // 显示提示弹窗 } }; // 处理复选框点击 const handleCheckboxClick = () => { if (show.value) { dialogVisible.value = true; // 显示提示弹窗 } }; </script> ``` ### 关键实现说明 1. **禁用状态控制** - 通过 `:disabled="show"` 属性动态禁用 Radio/Checkbox 组件组 - 当 `show === true` 时,组件自动进入禁用状态(视觉灰化) 2. **点击事件拦截** - 监听 `@click` 事件,当 `show === true` 时: - 阻止默认选项修改行为 - 通过 `dialogVisible.value = true` 触发弹窗显示 3. **弹窗提示** - 使用 `<van-dialog>` 组件展示提示信息 - 通过 `v-model:show="dialogVisible"` 控制弹窗显隐 - 设置 `show-cancel-button="false"` 隐藏取消按钮 4. **数据绑定** - 单选框:`v-model="radioValue"` - 复选框:`v-model="checkedGroup"` ### 效果说明 - 当 `show = true` 时: - 选项呈现禁用状态(灰色不可点击) - 点击选项时弹出提示对话框 - 选项值**不会发生改变** - 当 `show = false` 时: - 选项恢复正常交互 - 可自由修改选项值 > **提示**:若需要更复杂的条件判断(如部分选项禁用),可使用 `van-checkbox` 的 `disabled` 属性单独控制每个选项[^2]。 --- ### 相关问题 1. 如何实现 Vant 表单组件的条件禁用? 2. Vant Dialog 弹窗有哪些自定义配置项? 3. 在组合使用 Radio 和 Checkbox 时需要注意哪些数据绑定问题? 4. 如何优化 Vant 组件在移动端的点击延迟问题? 5. 除了弹窗提示,还有哪些方式可以阻止用户操作? [^1]: 组件内部使用了 Vant UI 的 van-dialog 和其他组件来构建界面。通过 v-model 和自定义事件,实现了数据的双向绑定和交互逻辑。 [^2]: [学习笔记]利用vant组件实现商城购物车功能。data数据中主要有两个:checkedGroup:[]和shopcard,前者绑定在van-checkbox-group上,表示选中的商品卡片。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值