Home > Article > Web Front-end > Which one has higher priority, v-if or v-for in vue?
In vue2, v-for has a higher priority than v-if; in vue3, v-if has a higher priority than v-for. In Vue, never use v-if and v-for on the same element at the same time, which will cause a waste of performance (each rendering will loop first and then perform conditional judgment); if you want to avoid this situation, Templates can be nested in the outer layer (page rendering does not generate DOM nodes), v-if judgment is performed at this layer, and then v-for loop is performed internally.
The operating environment of this tutorial: windows7 system, vue3 version, DELL G3 computer. The
v-if
directive is used to conditionally render a piece of content. Directives are used to conditionally render a block of content. This content will only be rendered if the directive's expression returns true. The v-for
directive renders a list based on an array. The v-for
directive requires special syntax in the form of item in items
, where items
is the source data array or object, and item
is Is an alias for the array element being iterated.
When v-for
, it is recommended to set the key
value and ensure that each key
value is unique, this is diff
Algorithm optimization.
<modal></modal>
Priority
In fact, the answers in vue2 and vue3 are completely opposite.
In vue2, v-for has a higher priority than v-if
In vue3, v-if has a higher priority In v-for
## v-for and v-if
in vue2 v-if and
v-for are both directives in the
vue template system.
vue template is compiled, the command system will be converted into an executable
render function.
p tag and use
v-if and
v-for
<div> <p> {{ item.title }} </p> </div>to create
vue Example, store
isShow and
items data.
const app = new Vue({ el: "#app", data() { return { items: [ { title: "foo" }, { title: "baz" }] } }, computed: { isShow() { return this.items && this.items.length > 0 } } })
ƒ anonymous() { with (this) { return _c('div', { attrs: { "id": "app" } }, _l((items), function (item) { return (isShow) ? _c('p', [_v("\n" + _s(item.title) + "\n")]) : _e() }), 0) } }
_l is the list rendering function of
vue, and a
if judgment will be made inside the function.
Preliminary conclusion:
v-for has a higher priority than
v-if.
Then put
v-for and
v-if in different labels
<div> <template> <p>{{item.title}}</p> </template> </div>and then output the
render function
ƒ anonymous() { with(this){return _c('div',{attrs:{"id":"app"}}, [(isShow)?[_v("\n"), _l((items),function(item){return _c('p',[_v(_s(item.title))])})]:_e()],2)} }At this time we can see that when
v-for and
v-if act on different tags, they are judged first and then the list is rendered.
export function genElement (el: ASTElement, state: CodegenState): string { if (el.parent) { el.pre = el.pre || el.parent.pre } if (el.staticRoot && !el.staticProcessed) { return genStatic(el, state) } else if (el.once && !el.onceProcessed) { return genOnce(el, state) } else if (el.for && !el.forProcessed) { return genFor(el, state) } else if (el.if && !el.ifProcessed) { return genIf(el, state) } else if (el.tag === 'template' && !el.slotTarget && !state.pre) { return genChildren(el, state) || 'void 0' } else if (el.tag === 'slot') { return genSlot(el, state) } else { // component or element ... }When making
if judgment,
v-for is judged before
v-if.
v-for has a higher priority than
v-if.
v-for and v-if in vue3
In vue3, v-if has a higher priority than v-fo, so when v-if is executed , the variable it calls does not exist yet, it will cause an exceptionExplanation: There are usually two situations that cause us to do this:
1. In order to filter the list Projects, such as:v-for="user in users" v-if="user.isActive"
activeUsers) and let it return the filtered list (such as
users.filter(u=>u.isActive)).
v-for="user in users" v-if="shouldShowUsers"
v-if to the container element (such as
ul,
ol) or wrap a layer of
template on the outside.
Note
Never use v-if and v-for on the same element at the same time, which will cause a waste of performance (Each rendering will loop first and then perform conditional judgment)<template v-if="isShow"> <p v-for="item in items"> </template>
computed: { items: function() { return this.list.filter(function (item) { return item.isShow }) } }
The above is the detailed content of Which one has higher priority, v-if or v-for in vue?. For more information, please follow other related articles on the PHP Chinese website!