如何理解vue中的v-model?

Ubuntu 24.04 安装 ROS2 Jazzy 手把手教你在Ubuntu24.04上安装JazzyROS2操作系统。 阅读详情

在这里插入图片描述

说到v-model,就想到了双向数据绑定,而且往往最常见的是在表单元素<input>,<textarea>,<select>中的使用,在一些自定义组件中也使用到了v-model。

那么为什么v-model双向数据绑定,自动更新元素呢?

v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:
text 和 textarea 元素使用 value 属性和 input 事件;
checkbox 和 radio 使用 checked 属性和 change 事件;
select 字段将 value 作为 prop 并将 change 作为事件。

因此我们将来好好探讨一下:

  • vue v-model源码分析
    • vue如何获取v-mode的值(value)
    • 用于生成各种类型model的gen*函数
    • vue如何设置v-mode的值(value)
  • <input v-model="..."><textarea v-model="..."></textarea>源码分析
  • <input type="checkbox" v-model="..."><input type="radio" v-model="...">源码分析
  • <select v-model="..."><option>...</option></select>源码分析
  • 自定义组件中的v-model源码分析
  • v-model的.lazy,.number,.trim修饰符源码分析

vue v-model源码分析

vue如何获取v-mode的值(value)
export default function model (
  el: ASTElement,
  dir: ASTDirective,
  _warn: Function
): ?boolean {
  warn = _warn
  const value = dir.value // vue通过这一行取到了v-model中的值,例如v-model="isChecked",v-model="inputValue"中isChecked和inputValue的值
...
}
const value = dir.value

vue通过这一行取到了v-model中的值,例如v-model=“isChecked”,v-model="inputValue"中isChecked和inputValue的值。
源码地址:web/compiler/directives/model.js 14~20行

其中ASTDirective的interface定义如下:

export interface ASTDirective {
  name: string;
  rawName: string;
  value: string; // 注意这里
  arg: string | undefined;
  modifiers: ASTModifiers | undefined;
}

源码地址:packages/vue-template-compiler/types/index.d.ts 80~86行

用于生成各种类型model的gen*函数
  if (el.component) {
    genComponentModel(el, value, modifiers)
    // component v-model doesn't need extra runtime
    return false
  } else if (tag === 'select') {
    genSelect(el, value, modifiers)
  } else if (tag === 'input' && type === 'checkbox') {
    genCheckboxModel(el, value, modifiers)
  } else if (tag === 'input' && type === 'radio') {
    genRadioModel(el, value, modifiers)
  } else if (tag === 'input' || tag === 'textarea') {
    genDefaultModel(el, value, modifiers)
  } else if (!config.isReservedTag(tag)) {
    genComponentModel(el, value, modifiers)
    // component v-model doesn't need extra runtime
    return false
  } else if (process.env.NODE_ENV !== 'production') {
    ...
  }

其中包括gen*开头的生成model的各种函数,我们会在下文中进行分析。
源码地址:web/compiler/directives/model.js 37~61行

vue如何设置v-mode的值(value)

genAssignmentCode函数(事件更新时,最终set v-model值的函数)

// 自定义component组件
const assignment = genAssignmentCode(value, valueExpression)
// input(text),textarea
let code = genAssignmentCode(value, valueExpression)
// <radio>
addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true)
// <select>
code = `${code} ${genAssignmentCode(value, assignment)}`
// <checkbox>
  addHandler(el, 'change',
    `var ?a=${value},` +
        '?el=$event.target,' +
        `?c=?el.checked?(${trueValueBinding}):(${falseValueBinding});` +
    'if(Array.isArray(?a)){' +
      `var ?v=${number ? '_n(' + valueBinding + ')' : valueBinding},` +
          '?i=_i(?a,?v);' +
      `if(?el.checked){?i<0&&(${genAssignmentCode(value, '?a.concat([?v])')})}` +
      `else{?i>-1&&(${genAssignmentCode(value, '?a.slice(0,?i).concat(?a.slice(?i+1))')})}` +
    `}else{${genAssignmentCode(value, '?c')}}`,
    null, true
  )

/**
 * Cross-platform codegen helper for generating v-model value assignment code.
 */
export function genAssignmentCode (
  value: string,
  assignment: string
): string {
  const res = parseModel(value)
  if (res.key === null) {
    return `${value}=${assignment}`
  } else {
    return `$set(${res.exp}, ${res.key}, ${assignment})`
  }
}

源码地址:src/compiler/directives/model.js 36~46行

<input v-model="..."><textarea v-model="..."></textarea>源码分析

一句话概览:text和textarea标签的value属性和input事件及genDefaultModel函数。

<!--text类型-->
<input v-model="singleMsg">
<!--textarea类型-->
<textarea v-model="multiMsg"></textarea>

等价于:

<input type="text" v-bind:value="singleMsg" v-on:input="singleMsg=$event.target.value" >
<textarea v-bind:value="multiMsg" v-on:input="multiMsg=$event.target.value"></textarea>

真的是这样吗?我们来看看源码。

genDefaultModel函数
function genDefaultModel (
  el: ASTElement,
  value: string,
  modifiers: ?ASTModifiers
): ?boolean {
  const type = el.attrsMap.type

  // warn if v-bind:value conflicts with v-model
  // except for inputs with v-bind:type
  if (process.env.NODE_ENV !== 'production') {
     ...
  }

  const { lazy, number, trim } = modifiers || {}
  const needCompositionGuard = !lazy && type !== 'range'
  const event = lazy // 此处我们没有传入lazy修饰符,因此event变量是'input'
    ? 'change'
    : type === 'range'
      ? RANGE_TOKEN
      : 'input'

  let valueExpression = '$event.target.value' 
  if (trim) {
    valueExpression = `$event.target.value.trim()`
  }
  if (number) {
    valueExpression = `_n(${valueExpression})`
  }

  let code = genAssignmentCode(value, valueExpression)
  if (needCompositionGuard) {
    code = `if($event.target.composing)return;${code}`
  }

  addProp(el, 'value', `(${value})`) // <input type="text" v-bind:value="singleMsg" ="singleMsg=$event.target.value" >
  addHandler(el, event, code, null, true) // 这一步印证了input事件<input v-on:input="...">
  if (trim || number) {
    addHandler(el, 'blur', '$forceUpdate()')
  }
}

源码分析在源码中有注释。

通过源码我们可以看出:
input(type=“text”)和textarea的v-model,通过value prop获得值,最终被解析为设置value attribute和input(若设置lazy,则触发change)事件,从而实现双向绑定。

源码地址:web/compiler/directives/model.js 127~147行

<input type="checkbox" v-model="..."><input type="radio" v-model="...">源码分析

一句话概览:input标签的checkbox和radio类型的checked属性和change事件及源码genCheckboxModel函数和genRadioModel函数。

<!--checkbox类型-->
<input type="checkbox" v-model="checkboxCtrl">
<!--input类型-->
<input type="radio" v-model="radioCtrl">

等价于:

<input type="checkbox" v-bind:value="checkboxCtrl" v-on:change="checkboxCtrl=$event.target.checked">
<input type="radio" v-bind:value="radioCtrl" v-on:change="radioCtrl=$event.target.checked">
genCheckboxModel函数
function genCheckboxModel (
  el: ASTElement,
  value: string,
  modifiers: ?ASTModifiers
) {
  const number = modifiers && modifiers.number
  const valueBinding = getBindingAttr(el, 'value') || 'null' // 从v-bind的value获得到初始值,印证了
<input v-bind:value="...">
  const trueValueBinding = getBindingAttr(el, 'true-value') || 'true'
  const falseValueBinding = getBindingAttr(el, 'false-value') || 'false'
  addProp(el, 'checked', // 设置标签的checked attribute,印证了<input ="checkboxCtrl=$event.target.checked">
    `Array.isArray(${value})` +
    `?_i(${value},${valueBinding})>-1` + (
      trueValueBinding === 'true'
        ? `:(${value})`
        : `:_q(${value},${trueValueBinding})`
    )
  )
  addHandler(el, 'change', // 这一步印证了<input v-on:change="...">
    `var ?a=${value},` +
        '?el=$event.target,' +
        `?c=?el.checked?(${trueValueBinding}):(${falseValueBinding});` +
    'if(Array.isArray(?a)){' +
      `var ?v=${number ? '_n(' + valueBinding + ')' : valueBinding},` +
          '?i=_i(?a,?v);' +
      `if(?el.checked){?i<0&&(${genAssignmentCode(value, '?a.concat([?v])')})}` +
      `else{?i>-1&&(${genAssignmentCode(value, '?a.slice(0,?i).concat(?a.slice(?i+1))')})}` +
    `}else{${genAssignmentCode(value, '?c')}}`,
    null, true
  )
}
genRadioModel函数
function genRadioModel (
  el: ASTElement,
  value: string,
  modifiers: ?ASTModifiers
) {
  const number = modifiers && modifiers.number
  let valueBinding = getBindingAttr(el, 'value') || 'null' // 印证了
<input v-bind:value="...">
  valueBinding = number ? `_n(${valueBinding})` : valueBinding
  addProp(el, 'checked', `_q(${value},${valueBinding})`)  // 设置标签的checked attribute,印证了<input ="radioCtrl=$event.target.checked">
  addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true) // 这一步印证了<input v-on:change="...">
}

源码分析在源码中有注释。

通过源码我们可以看出:
input(type=“checkbox”)和input(type=“radio”)的v-model,通过value prop获得值,最终被解析为设置checked attribute和change事件,从而实现双向绑定。

源码地址:web/compiler/directives/model.js 67~96行

<select v-model="..."><option>...</option></select>源码分析

一句话概览:select标签的value属性和change事件及源码genSelect函数。

<!--select类型-->
  <select v-model="selectCtrl">
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>

等价于:

  <select v-bind:value="selectValue" v-on:change="selectValue=$event.target.options.selected">
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>
genSelect 函数
function genSelect (
  el: ASTElement,
  value: string,
  modifiers: ?ASTModifiers
) {
  const number = modifiers && modifiers.number
  // 这一步印证了<select v-bind:value="selectValue" ...="selectValue=$event.target.options.selected">
  const selectedVal = `Array.prototype.filter` +
    `.call($event.target.options,function(o){return o.selected})` +
    `.map(function(o){var val = "_value" in o ? o._value : o.value;` +
    `return ${number ? '_n(val)' : 'val'}})` 

  const assignment = '$event.target.multiple ? ?selectedVal : ?selectedVal[0]'
  let code = `var ?selectedVal = ${selectedVal};`
  code = `${code} ${genAssignmentCode(value, assignment)}`
  // 这一步印证了 <select v-on:change="...">
  addHandler(el, 'change', code, null, true)
}

源码分析在源码中有注释。

通过源码我们可以看出:
select的v-model,通过value prop获得值,最终被解析为设置selected attribute和change事件,从而实现双向绑定。

源码地址:web/compiler/directives/model.js 110~125行

自定义组件中的v-model源码分析

一句话概览:如何理解自定义组件中的v-model及genComponentModel,transformModel函数?

其实不仅仅是input,textarea,和select这些常见的原生表单元素可以使用v-model,对于自定义的vue组件我们也可以使用v-model。

Vue.component('base-checkbox', {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: {
    checked: Boolean
  },
  template: `
    <input
      type="checkbox"
      v-bind:checked="checked"
      v-on:change="$emit('change', $event.target.checked)"
    >
  `
})
<base-checkbox v-model="lovingVue"></base-checkbox>

lovingVue的值会传入checked这个prop,同时当组件触发一个change事件并且附带了一个新值的时候,lovingVue的值会被更新。

如何从源码去理解这一段话吗?

genComponentModel函数(构造出需要调用transformModel函数的el.model对象)
export function genComponentModel (
  el: ASTElement,
  value: string,
  modifiers: ?ASTModifiers
): ?boolean {
  const { number, trim } = modifiers || {}
  ...
  const assignment = genAssignmentCode(value, valueExpression)
  el.model = {
    value: `(${value})`,
    expression: JSON.stringify(value),
    callback: `function (${baseValueExpression}) {${assignment}}`
  }
}

源码地址:src/compiler/directives/model.js 6~31行
重点关注el.model这一行。因为vue在创建自定义组件时,会对el.model这一行进行一些操作。

  // transform component v-model data into props & events
  if (isDef(data.model)) {
    transformModel(Ctor.options, data)
  }
transformModel函数(转化组件v-model的value和callback到prop和event handler)
// transform component v-model info (value and callback) into
// prop and event handler respectively.
function transformModel (options, data: any) {
  const prop = (options.model && options.model.prop) || 'value' //   model: {prop: 'checked',event:'change'} 中的”checked“作为prop
  const event = (options.model && options.model.event) || 'input' // model: {prop: 'checked',event:'change'} 中的”change“作为event
  ;(data.attrs || (data.attrs = {}))[prop] = data.model.value // lovingVue的值会传入checked这个prop
  const on = data.on || (data.on = {})
  const existing = on[event]
  const callback = data.model.callback
  if (isDef(existing)) {
    if (
      Array.isArray(existing)
        ? existing.indexOf(callback) === -1
        : existing !== callback
    ) {
      on[event] = [callback].concat(existing)
    }
  } else {
    on[event] = callback // "同时当组件触发一个change事件并且附带了一个新值的时候,lovingVue的值会被更新。"
  }
}

源码地址:src/core/vdom/create-component.js 250~268行
”lovingVue的值会传入checked这个prop“的源码解释:
data.attrs || (data.attrs = {}))[prop] = data.model.value。
获取到组价的v-model="lovingVue"中lovingVue的值,并且将v-model的longVue传入props的checked。若对如何获取v-model中的值有不理解,具体可以看上文第一部分vue v-model源码分析(vue如何获取v-mode的值(value))。

"同时当组件触发一个change事件并且附带了一个新值的时候,lovingVue的值会被更新。"的源码解释:
通过el.model = {... callback: }和const callback = data.model.callback可以推断出:el.on.change = callback,而这个callback又是genAssignmentCode,在genAssignmentCode中会对v-model的值进行set。若是对如何set v-model的值有疑问,可以查看上文中的vue v-model源码分析(vue如何设置v-mode的值(value))。

v-model的.lazy,.number,.trim修饰符源码分析

const { lazy, number, trim } = modifiers || {}
...
  const event = lazy
    ? 'change'
    : type === 'range'
      ? RANGE_TOKEN
      : 'input'

  ...
  if (trim) {
    valueExpression = `$event.target.value.trim()`
  }
  if (number) {
    valueExpression = `_n(${valueExpression})`
  }
  • lazy仅仅是一个判断触发标签change还是input事件的标识符,lazy为true时,触发change
  • trim仅仅是调用了String.prototype.trim()
  • number这是vue的_n函数,而这个函数其实是一个StringToNumber函数,相当简单
/**
 * Convert an input value to a number for persistence.
 * If the conversion fails, return original string.
 */
export function toNumber (val: string): number | string {
  const n = parseFloat(val)
  return isNaN(n) ? val : n
}

源码地址:shared/util.js 97~100行

参考资料:
https://cn.vuejs.org/v2/guide/components.html#%E5%9C%A8%E7%BB%84%E4%BB%B6%E4%B8%8A%E4%BD%BF%E7%94%A8-v-model
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event

5分钟搞定!用Cursor和.NET 9.0快速搭建串口通讯上位机(附VS Code插件配置) 本文分享了如何利用Cursor AI编程助手与.NET 9.0,在5分钟内快速构建一个功能完整的串口通讯上位机程序。通过自然语言描述需求,AI自动生成WinForms界面和核心代码,极大提升了硬件调试工具的定制开发效率。文章详细介绍了环境配置、AI协作编码、功能实现与调试的全过程。 阅读详情

相关推荐

激光测距仪DIY指南:从元器件选型到精度优化(附避坑清单)

本文提供了一份详尽的激光测距仪DIY实战指南,涵盖从核心元器件选型到系统集成的全过程。重点解析了相位法测距原理,并分享了激光发射器与APD探测器选型、信号链路设计、低成本改造方案以及精度校准等关键环节的避坑经验,帮助电子爱好者与开发者深入理解并成功搭建高精度测距系统。

h6i7j8的博客 944

Vue之v-model的使用

v-model

weixin_42504805的博客 2万+

python123题目——个税计算器

类型:简单分支。

m0_62488776的博客 5803

vue常用指令(v-mode)

双向数据绑定。

CAUC_lin的博客 1559

vivado下ECO操作-不重新综合实现修改属性并生成.bit

ECO即engineer change order,即工程变更指令,可以对设计做局部小改动并只对改动部分重新布局布线并生成.bit。在一个工程动辄编译几个小时情况下,可以在调试中节省大量时间。比如我们在调试中,需要改变时钟占空比或者相位,需要改变寄存器初值等等,此时用ECO暂时改动,待验证后在重新编译无疑是最有效率的方法。 实现ECO通常有两种方式,一是通过vivado界面完成,另一种方法就是tcl脚本。所有的ECO操作都可以通过tcl操作完成,有的操作用vivado界面无法完成,只能通过tcl。以下主要

4657

MRI脑影像分析从哲学到技术:一文搞懂VBM预处理基本原理(全网最详细解析)

   分析大脑解剖学差异最常用方法之一是基于体素的形态学方法(voxel-based morphometry, VBM)。 VBM的基本思想是测量大脑组织,尤其是灰质的局部浓度的差异。在大脑的每个体素处进行操作,然后在两个或多个实验组之间进行统计比较,从而在受调查的组之间建立特定大脑区域中脑组织浓度的统计学显着差异。 VBM分析基于(高分辨率)MRI脑部扫描,涉及大量处理步骤,主要是空间归一化,分割,平滑和统计分析,最终结果是统计图,显示了各组之间组织类型明显不同的区域[^1]。 参考 [^1] ..

意疏的学习笔记 3万+

vue v-model的详细介绍

vue v-model的详细介绍

FGGIT的博客 3489

高通SA8295P音频接口深度解析:全面掌握SA8295P的LS-I2S、PCM/TDM与高性能音频处理技术设计

SA8295P提供丰富的音频接口选项,包括LS-I2S、PCM/TDM和HS-I2S接口,具备灵活的配置选项,适合各种高保真音频和高速数据传输应用。结合LS-I2S和PCM/TDM接口:在复杂的音频编解码器设计中,可结合使用LS-I2S和PCM/TDM接口,以处理和传输不同的音频数据流。使用HS-I2S接口:在软件定义无线电(SDR)系统中,高速I2S接口可处理高速数据流,如无线电信号的解码和处理。LS-I2S(低速I2S)接口是SA8295P的一部分,提供了丰富的音频数据传输选项。

weixin_43199439的博客 1405

vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持

在计算机科学中,语法糖(syntactic sugar)是指编程语言中可以更容易地表达一个操作的语法。它可以使程序员更加容易地使用这门语言,使操作变得更加清晰、方便,或者更加符合程序员的编程习惯。具体来说,语法糖是语言中的一个构件,当去掉该构件后并不影响语言的功能和表达能力。例如,C语言中的标记a[i]就是*(a+i)的语法糖。语言的处理器,包括编译器,静态分析器等,经常会在处理之前把语法糖构件转换成更加基础的构件,这个过程通常被称为"desugaring"。简而言之,语法糖就是一种便捷写法。

在这里,我乐于倾囊相授,分享我的技术心得、项目实战经验、技术技巧。希望能够惠及更多的开发者,助力大家在技术的海洋中扬帆远航。 1万+

三极管、MOS管和晶体管综合对比——《器件手册--三极管、MOS管和晶体管》

IGBT(Insulated Gate Bipolar Transistor,绝缘栅双极型晶体管)是一种复合全控型电压驱动式功率半导体器件,结合了MOSFET的高输入阻抗、开关速度快的优点和双极型晶体管(BJT)的低导通压降、高电流密度的优点。例如,在NPN型三极管中,当基极电流增加时,集电极电流会按照一定的比例(放大倍数β)增加,这个比例通常在几十到几百之间。在NMOS管中,当栅极相对于源极的电压(Vgs)小于开启电压(Vth)时,漏极和源极之间没有导电沟道,电流无法通过,处于截止状态。

XU157303764的博客 2881

基于深度学习的三维重建算法——详解与实现

随着深度学习技术的迅猛发展,基于深度学习的三维重建算法在最近几年取得了显著的进展。而基于深度学习的三维重建算法通过利用深度神经网络,能够从大规模数据中学习到更准确、鲁棒的三维结构表示。本文综述了基于深度学习的三维重建算法,并给出了相应的源代码。随着深度学习技术的不断发展,我们相信基于深度学习的三维重建算法将会在未来得到更广泛的应用。实验结果表明,基于深度学习的三维重建算法在准确性和鲁棒性方面取得了显著的提升。以上是关于基于深度学习的三维重建算法的详细介绍与实现,希望对您有所帮助。

CyberGenius的博客 1227

Vue指令之v-model详解

通过结合v-bind和v-model,我们可以动态生成表单元素并进行数据绑定。这使得 Vue.js 在处理动态数据和复杂表单时变得非常灵活和强大。在这些例子中,v-bind用于动态生成表单选项,而v-model则处理数据的双向绑定。

weixin_51743499的博客 1307

芒果YOLOv1改进35:主干Backbone篇之MobileViTv3:全网首发最新 MobileViTv3 系列最强改进版本(三)|轻量化Transformer视觉转换器,简单有效地融合了本地全局

芒果YOLOv1改进35:主干Backbone篇之MobileViTv3:全网首发最新 MobileViTv3 系列最强改进版本(三)|轻量化Transformer视觉转换器,简单有效地融合了本地全局

包括YOLOv5、YOLOv7、YOLOv8等模型改进 416

【Vue】怎么理解Vue中双向数据绑定v-model?

1:v-model是什么? 语法糖。不够详细?实现数据双向绑定的语法糖! 2:v-model的本质? 既然是实现数据双向绑定,那么如果不使用v-model该怎么实现?请看下面栗子: <div id="app"> <input type="text" v-bind:value="defaultValue" v-on:input="setDefaultValue($event.target.value)"> </div> let vm = new V

任她雨雪风晴 698

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Vue组件的v-model 和 Vue2 中的.sync理解

组件的v-model 和 Vue2 中的.sync理解 在Vue3当我们给组件v-model等于一个值的时候,组件会给我们默认绑定一个属性:modelValue和自定义属性on-update:modelValue:f($even) <!-- <HelloWorld msg="ganbadie" v-model="title"/> --> <!-- 相当于 --> <HelloWorld msg="ganbadie" :modelValue="tit

weixin_47908090的博客 1821

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

理解在vue自定义组件中使用v-model

今天在看视频的时候,看到有人将一个input封装成一个自定义组件,然后他写的代码是这样的 //父组件 <k-input v-model="model.username"></k-input> //子组件 <input type="text" :value="inputValue" @input="onInput"> //子组件 export default { data () { return { }; }, props:{ inp

啊啊怪的学习日记 315

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深入理解 Vue 组件通信之 v-model:从基础到实战

在使用自定义组件时,要确保组件正确支持v-model。如果组件没有按照modelValue和的规范来实现,v-model可能无法正常工作。同时,不同版本的 Vue 对v-model的实现可能略有差异,在升级框架版本时,需要注意兼容性问题。v-model作为 Vue 组件通信的重要方式,在实际开发中有着广泛的应用。通过深入理解其底层原理和应用场景,开发者可以更加灵活、高效地使用它,构建出更加健壮和易用的前端应用。无论是处理表单数据,还是实现复杂的组件交互,v-model。

m0_57836225的博客 1145

vue对v-model的理解

对v-model的理解’ v-model即可以作用于表单元素,又可作用于自定义组件,无论是哪一种情况,它都是一个语法糖,最终会生成一个属性和一个事件 当其作用于表单元素时 vue会根据作用的表单元素类型而生成合适的属性和事件。例如,作用于普通文本框的时候,它会生成value属性和input事件,而当其作用于单选框或多选框时,它会生成checked属性和change事件。 v-model也可作用于自定义组件,当其作用于自定义组件时; 默认情况下,它会生成一个value属性和in

weixin_41277748的博客 730

vue中v-model和 :model的区别理解

1、v-model: 通常用于表单上双向数据的绑定,如果除了表单其他组件使用时,起不到任何效果。它还可以实现子组件到父组件的双向数据动态绑定。 <input type="text" v-model="message"> new Vue({ el:'#app', data:{ message:"你好" } }) 1、:model :model是v-bind:model的缩写。 <child :model="message"></child>

qq_45001147的博客 4120

vue 给checkbox 赋值_vue中关于checkbox数据绑定v-model指令的个人理解

在使用input复选框配合v-model时,遇到了一些疑惑,即当复选框对应的v-model是一个数组和一个字符串时,得到的类型不一样,下面是从网上找的,这里记录下:下面是最常见的例子:{{msg}}js里data初始化数据new Vue({el: "#myApp",data() {return {msg:'hello'}},浏览器渲染:上面可知,v-model对应的数据为input的value属性...

weixin_29129919的博客 2584

深入理解 Vue.js 中的 v-model 指令

v-model 指令是 Vue.js 提供的一个强大特性,其核心作用在于实现表单数据的双向绑定。这意味着,当用户在表单元素(如 input、textarea、select 等)中进行输入操作时,数据会实时更新到对应的 Vue 实例数据中;反之,当 Vue 实例中的数据发生变化时,表单元素的值也会随之更新,从而始终保持数据的一致性。在 JavaScript 文件(如app.js)中,创建一个 Vue 实例,并在data选项中定义用于存储搜索条件的变量,它是一个包含category(分类)和state。

m0_57836225的博客 1542

如何理解Vue的v-model指令

转载:https://segmentfault.com/a/1190000010744545?utm_source=tag-newest 本文主要讲解v-model指令,主要包括HTML元素的v-model和组件上的v-model两种,用四个简单的案例介绍v-model的使用。 案例一:HTML元素的v-model -输入框(text) <!DOCTYPE html> ...

xqhys的博客 231

vue v model html,如何理解Vue的v-model指令

本文主要讲解v-model指令,主要包括HTML元素的v-model和组件上的v-model两种,用四个简单的案例介绍v-model的使用。案例一:HTML元素的v-model -输入框(text)v-model指令{{price}}new Vue({el: '#app4',data: {price: '20'}});案例二: 定制组件的v-model - 输入框(text)v-model指令{...

weixin_35662171的博客 565

自己对 Vue2.x 中 v-model 指令的理解

v-model 指令 说明:v-model 对<input>、<textarea>、<select>这些表单元素进行双向的数据绑定,实时更新。 数据的绑定通过 v-model 后面接的变量实现的, 如,下列是通过 message 这一变量绑定的 <input type="text" v-model="message" placeholder="edit me"> <p>Message is:{{message}}</p> (变量 me

next_sr的博客 479

vue 给checkbox 赋值_浅谈vue中关于checkbox数据绑定v-model指令的个人理解

vue.js为开发者提供了很多便利的指令,其中v-model用于表单的数据绑定很常见,下面是最常见的例子:{{msg}}js里data初始化数据new Vue({el: "#myApp",data() {return {msg:'hello'}},浏览器渲染:上面可知,v-model对应的数据为input的value属性但是如果是checkbox,会有一点问题{{msg}}没有给checkbox设...

weixin_30517215的博客 1223

关于vue的v-model的自己理解(用于自己复习)

关于vue的v-model的自己理解 1.在一般使用情况下,v-model为: &amp;lt;input v-model=&quot;searchText&quot;&amp;gt; 等价于 &amp;lt;input v-bind:value=&quot;searchText&quot; v-on:input=&quot;searchText = $event.target.value&quot;&amp;g

suyongsimple的专栏 5742
上一篇: 如何理解vue中的v-bind?
下一篇: 实用webpack插件之DefinePlugin
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趁你还年轻233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值