<style>
.vmodel-demo { font-family: system-ui; }
.form-group { margin-bottom: 16px; }
.form-group label { display: block; color: #94a3b8; margin-bottom: 6px; font-size: 14px; }
.form-group input, .form-group select { width: 100%; padding: 10px 12px; border: 2px solid #334155; background: #1e293b; color: white; border-radius: 8px; font-size: 14px; }
.form-group input:focus { outline: none; border-color: #3b82f6; }
.data-display { background: #0f172a; padding: 16px; border-radius: 8px; font-family: monospace; font-size: 13px; }
.data-row { display: flex; justify-content: space-between; padding: 6px 0; border-bottom: 1px solid #1e293b; }
.data-row:last-child { border-bottom: none; }
.key { color: #94a3b8; }
.val { color: #22c55e; }
.checkbox-group { display: flex; gap: 16px; flex-wrap: wrap; }
.checkbox-item { display: flex; align-items: center; gap: 6px; color: #e2e8f0; }
.checkbox-item input { width: 18px; height: 18px; accent-color: #3b82f6; }
.info { background: #1e3a5f; padding: 12px; border-radius: 6px; margin-top: 12px; font-size: 13px; color: #93c5fd; }
</style>
<div class="vmodel-demo">
<div class="form-group">
<label>文本输入 (text)</label>
<input type="text" id="textInput" value="Hello Vue" oninput="updateData()">
</div>
<div class="form-group">
<label>数字输入 (number)</label>
<input type="number" id="numberInput" value="42" oninput="updateData()">
</div>
<div class="form-group">
<label>下拉选择 (select)</label>
<select id="selectInput" onchange="updateData()">
<option value="vue">Vue</option>
<option value="react">React</option>
<option value="angular">Angular</option>
</select>
</div>
<div class="form-group">
<label>复选框 (checkbox)</label>
<div class="checkbox-group">
<label class="checkbox-item">
<input type="checkbox" id="check1" checked onchange="updateData()"> 选项 A
</label>
<label class="checkbox-item">
<input type="checkbox" id="check2" onchange="updateData()"> 选项 B
</label>
<label class="checkbox-item">
<input type="checkbox" id="check3" onchange="updateData()"> 选项 C
</label>
</div>
</div>
<div class="data-display">
<div style="color: #64748b; margin-bottom: 8px;">📊 实时数据 (模拟 v-model 绑定)</div>
<div class="data-row"><span class="key">text:</span><span class="val" id="dataText">"Hello Vue"</span></div>
<div class="data-row"><span class="key">number:</span><span class="val" id="dataNumber">42</span></div>
<div class="data-row"><span class="key">selected:</span><span class="val" id="dataSelect">"vue"</span></div>
<div class="data-row"><span class="key">checked:</span><span class="val" id="dataCheck">["A"]</span></div>
</div>
<div class="info">
💡 v-model = :value + @input 的语法糖。修改上面的表单,右侧数据实时更新!
</div>
</div>
<script>
function updateData() {
document.getElementById('dataText').textContent = '"' + document.getElementById('textInput').value + '"';
document.getElementById('dataNumber').textContent = document.getElementById('numberInput').value;
document.getElementById('dataSelect').textContent = '"' + document.getElementById('selectInput').value + '"';
const checked = [];
if (document.getElementById('check1').checked) checked.push('A');
if (document.getElementById('check2').checked) checked.push('B');
if (document.getElementById('check3').checked) checked.push('C');
document.getElementById('dataCheck').textContent = JSON.stringify(checked);
}
</script>