in views/vue.js [9924:10017]
function processAttrs(el) {
const list = el.attrsList;
let i, l, name, rawName, value, modifiers, isProp;
for (i = 0, l = list.length; i < l; i++) {
name = rawName = list[i].name;
value = list[i].value;
if (dirRE.test(name)) {
// mark element as dynamic
el.hasBindings = true;
// modifiers
modifiers = parseModifiers(name);
if (modifiers) {
name = name.replace(modifierRE, "");
}
if (bindRE.test(name)) {
// v-bind
name = name.replace(bindRE, "");
value = parseFilters(value);
isProp = false;
if (modifiers) {
if (modifiers.prop) {
isProp = true;
name = camelize(name);
if (name === "innerHtml") {
name = "innerHTML";
}
}
if (modifiers.camel) {
name = camelize(name);
}
if (modifiers.sync) {
addHandler(
el,
"update:" + camelize(name),
genAssignmentCode(value, "$event")
);
}
}
if (
isProp ||
(!el.component &&
platformMustUseProp(el.tag, el.attrsMap.type, name))
) {
addProp(el, name, value);
} else {
addAttr(el, name, value);
}
} else if (onRE.test(name)) {
// v-on
name = name.replace(onRE, "");
addHandler(el, name, value, modifiers, false, warn$2);
} else {
// normal directives
name = name.replace(dirRE, "");
// parse arg
const argMatch = name.match(argRE);
const arg = argMatch && argMatch[1];
if (arg) {
name = name.slice(0, -(arg.length + 1));
}
addDirective(el, name, rawName, value, arg, modifiers);
if ("development" !== "production" && name === "model") {
checkForAliasModel(el, value);
}
}
} else {
// literal attribute
{
const res = parseText(value, delimiters);
if (res) {
warn$2(
name +
'="' +
value +
'": ' +
"Interpolation inside attributes has been removed. " +
"Use v-bind or the colon shorthand instead. For example, " +
'instead of <div id="{{ val }}">, use <div :id="val">.'
);
}
}
addAttr(el, name, JSON.stringify(value));
// #6887 firefox doesn't update muted state if set via attribute
// even immediately after element creation
if (
!el.component &&
name === "muted" &&
platformMustUseProp(el.tag, el.attrsMap.type, name)
) {
addProp(el, name, "true");
}
}
}
}