$refs
Computed 내부에 어떻게 액세스 합니까? 계산 된 속성이 처음 실행될 때는 항상 정의되지 않습니다.
답변
여기서 내 질문에 답하려고하는데 다른 곳에서는 만족스러운 답을 찾을 수 없었습니다. 때로는 계산을 수행하기 위해 dom 요소에 액세스해야하는 경우도 있습니다. 다른 사람들에게 도움이되기를 바랍니다.
컴포넌트가 마운트되면 Vue를 속여 계산 된 속성을 업데이트해야했습니다.
Vue.component('my-component', {
data(){
return {
isMounted: false
}
},
computed:{
property(){
if(!this.isMounted)
return;
// this.$refs is available
}
},
mounted(){
this.isMounted = true;
}
})
답변
Vue js 가이드 를 인용하는 것이 중요하다고 생각합니다 .
$ ref는 구성 요소가 렌더링 된 후에 만 채워지며 반응하지 않습니다. 이는 직접적인 자식 조작을위한 이스케이프 해치로만 사용됩니다. 템플릿이나 계산 된 속성 내에서 $ ref에 액세스하지 않아야합니다.
따라서 항상 자신의 방식을 해킹 할 수 있지만해야 할 일은 아닙니다.
답변
$refs
애프터가 필요한 경우 후크를 v-if
사용할 수 있습니다 updated()
.
<div v-if="myProp"></div>
updated() {
if (!this.myProp) return;
/// this.$refs is available
},
답변
나는 방금이 같은 문제를 가지고 왔고 이것이 계산 된 속성이 작동하지 않는 상황 유형이라는 것을 깨달았습니다.
현재 문서 ( https://vuejs.org/v2/guide/computed.html ) 에 따르면 :
“[…] 계산 된 속성 대신 메서드와 동일한 기능을 정의 할 수 있습니다. 최종 결과에 대해 두 가지 접근 방식은 실제로 동일합니다. 그러나 계산 된 속성은 반응 형에 따라 캐시된다는 점이 다릅니다. 종속성. 계산 된 속성은 일부 반응 종속성이 변경된 경우에만 재평가됩니다. “
따라서 이러한 상황에서 (아마) 발생하는 것은 구성 요소의 마운트 된 수명주기를 완료하고 참조를 설정하는 것이 계산 된 속성의 종속성에 대한 반응 적 변경으로 간주되지 않는다는 것입니다.
예를 들어, 제 경우에는 ref 테이블에 선택된 행이 없을 때 비활성화해야하는 버튼이 있습니다. 따라서이 코드는 작동하지 않습니다.
<button :disabled="!anySelected">Test</button>
computed: {
anySelected () {
if (!this.$refs.table) return false
return this.$refs.table.selected.length > 0
}
}
할 수있는 일은 계산 된 속성을 메서드로 바꾸는 것입니다. 그러면 제대로 작동합니다.
<button :disabled="!anySelected()">Test</button>
methods: {
anySelected () {
if (!this.$refs.table) return false
return this.$refs.table.selected.length > 0
}
}
답변
저와 같은 다른 사용자는 데이터를 prop에 전달하기 만하면 data
됩니다.computed
Vue.component('my-component', {
data(){
return {
myProp: null
}
},
mounted(){
this.myProp= 'hello'
//$refs is available
// this.myProp is reactive, bind will work to property
}
})
답변
원하는 경우 속성 바인딩을 사용합니다. : disabled prop은이 경우 반응합니다.
<button :disabled="$refs.email ? $refs.email.$v.$invalid : true">Login</button>
그러나 두 필드를 확인하기 위해 더미 방법으로 다른 방법을 찾지 못했습니다.
<button
:disabled="$refs.password ? checkIsValid($refs.email.$v.$invalid, $refs.password.$v.$invalid) : true">
{{data.submitButton.value}}
</button>
methods: {
checkIsValid(email, password) {
return email || password;
}
}