[Vue warn] :$attrs는 읽기 전용입니다.[Vue warn] :$120은 읽기 전용입니다.
Vuejs는 비교적 초보라서 키를 누를 때마다 다음과 같은 경고가 표시됩니다.
[Vue warn]: $attrs is readonly.
found in
---> <RouterLink>
<HeaderComponent> at src\components\Header_Component.vue
<App> at src\App.vue
<Root>
그리고.
[Vue warn]: $listeners is readonly.
found in
---> <RouterLink>
<HeaderComponent> at src\components\Header_Component.vue
<App> at src\App.vue
<Root>
다만, 이러한 경고는 조작성에 전혀 영향을 주지 않는 것 같습니다.$attrs도 $listeners도 호출하지 않습니다.이러한 경고들이 어디서 오는지는 잘 모르겠습니다.
여기 Header_Component가 있습니다.vue:
<template>
<header class="header">
<div class='nav nav-side nav-oneLine'>
<a class='nav-link' href='#'><router-link @click.native="addClass(), setLogoTrue('project')" to='/Projects'>PROJECTS</router-link></a>
<a class='nav-link' href='#'><router-link @click.native="addClass(), setLogoTrue('blog')" to='/Blog'>BLOG</router-link></a>
<a class='nav-link' href='#'><router-link @click.native="addClass(), setLogoTrue('aboutme')" to='/Aboutme'>ABOUT ME</router-link></a>
<a class='nav-link' href='#'><router-link @click.native="addClass(), setLogoTrue('resume')" to='/Resume'>RESUME</router-link></a>
</div>
</header>
</template>
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
data() {
return{
logoTrue: <Object> {
'main': true,
'project': false,
'blog': false,
'aboutme': false,
'resume': false
},
main: <boolean>true,
header: <any>"",
image: <any>"",
h1: <any>"",
h2: <any>"",
nav: <any>"",
logos: <any>"",
break: <any>"",
}
},
components: {
insta, facebook, github, codepen, mainLogo, mainLogoSmall, test, projectsLogo, blogsLogo, aboutmeLogo, resumeLogo
}
methods:{
addClass(){
if (document.querySelector('.h2Active') == null && document.querySelector('.header_top') == null) {
this.add_newClasses()
this.emit_finished(true)
setTimeout(() => {
this.remove_separators()
}, 800)
} else {
console.log('classes already exist!')
this.$emit('reloadBackToTop')
}
},
remove_separators() {
let breaker = document.getElementsByClassName('separator')
while (breaker[0]) {
this.nav.removeChild(breaker[0])
}
},
setLogoTrue(target) {
for (var key in this.logoTrue) {
if (this.logoTrue.hasOwnProperty(key)) {
if (key == target) {
this.logoTrue[key] = true
} else {
this.logoTrue[key] = false
}
}
}
},
apply_topClasses() {
this.header.classList.add('header_top')
this.image.classList.add('imgStatic_top')
this.h1.classList.add('h1_name_top')
this.h2.classList.add('h2_name_top')
this.logos.classList.add('logo_links_top')
this.nav.classList.add('nav-side_top')
this.emit_finished(false)
},
add_newClasses() {
if (window.innerWidth < 1060) {
this.nav.classList.add('navActive_small')
this.image.classList.add('imgActive_small')
} else {
this.nav.classList.add('navActive')
this.image.classList.add('imgActive')
}
this.logos.classList.add('logo_linksActive')
this.header.classList.add('headerActive')
this.h1.classList.add('h1Active')
this.h2.classList.add('h2Active')
this.image.classList.remove('imgStatic')
},
emit_finished(delay:boolean) {
if (delay) {
setTimeout (() => {
this.$emit('finishedLoading')
console.log('finished_loading')
}, 2000)
} else {
console.log('here')
this.$emit('finishedLoading')
}
},
adjust_clientWidth() {
if (window.innerWidth < 1060) {
// this.remove_separators()
let bigActive = document.getElementsByClassName('big-nav')
let navActive = document.getElementsByClassName('navActive')
if (bigActive.length > 0) {
this.nav.classList.add('small-nav')
this.nav.classList.remove('big-nav')
this.image.classList.add('small-img')
this.image.classList.remove('big-img')
} else if (navActive.length > 0) {
this.nav.classList.add('small-nav')
this.nav.classList.remove('nav-side')
this.nav.classList.remove('navActive')
this.image.classList.add('small-img')
this.image.classList.remove('imgActive')
}
} else {
let smallActive = document.getElementsByClassName('small-nav')
let smallnavActive = document.getElementsByClassName('navActive_small')
if (smallActive.length > 0) {
this.nav.classList.add('big-nav')
this.nav.classList.remove('small-nav')
this.image.classList.add('big-img')
this.image.classList.remove('small-img')
} else if (smallnavActive.length > 0) {
this.nav.classList.add('big-nav')
this.nav.classList.remove('nav-side')
this.nav.classList.remove('navActive_small')
this.image.classList.add('big-img')
this.image.classList.remove('imgActive_small')
}
}
}
},
created: function() {
window.addEventListener('resize',this.adjust_clientWidth)
},
mounted: function() {
this.header = document.getElementsByClassName('header')[0]
this.image = document.getElementsByClassName('img')[0]
this.h1 = document.getElementsByClassName('h1_name')[0]
this.h2 = document.getElementsByClassName('h2_name')[0]
this.nav = document.getElementsByClassName('nav')[0]
this.logos = document.getElementsByClassName('logo_links')[0]
if (window.location.hash != "#/") {
this.remove_separators()
if (window.location.hash == "#/Projects") {
this.setLogoTrue('project')
} else if (window.location.hash.includes("#/Blog") || window.location.hash.includes("#/blog")) {
this.setLogoTrue('blog')
} else if (window.location.hash == "#/Aboutme") {
this.setLogoTrue('aboutme')
} else if (window.location.hash == "#/Resume") {
this.setLogoTrue('resume')
}
this.apply_topClasses()
}
}
})
</script>
<style lang="css" scoped>
(...)
</style>
도와주셔서 감사합니다!
아마 다른 질문에서 아시겠지만, 저는 다른 모든 분들의 시간을 절약하기 위해 여기에 답변을 올립니다.
이러한 오류의 문제는 일반적으로 Vue를 여러 번 Import하기 때문입니다.먼저 기본 앱에서, 그 다음 구성 요소 파일에서도 사용할 수 있습니다.따라서 Import Vue 행을 Header_Component에서 'vue'에서 삭제합니다.vue가 문제를 해결합니다.단, 컴포넌트를 선언하는 방법을 다음과 같이 변경해야 합니다.
<script lang="ts">
//import Vue from 'vue' <-- Commented the import line
export default { // <-- Removed Vue.extend()
data() {
return{
logoTrue: <Object> {
'main': true,
'project': false,
'blog': false,
'aboutme': false,
'resume': false
},
main: <boolean>true,
header: <any>"",
image: <any>"",
h1: <any>"",
h2: <any>"",
nav: <any>"",
logos: <any>"",
break: <any>"",
}
}
...more code...
}
</script>
단일 파일 구성 요소에 대한 자세한 내용은 다음과 같습니다.
반드시 제거할 필요는 없습니다.Vue.extend
이 문제가 발생하는 이유는 두 가지가 있습니다.Vue를 여러 위치에서 가져왔기 때문입니다.
또는 이 문제는 웹 팩이 Vue를 제대로 처리하지 못하고 외부로 간주하기 때문일 수 있습니다.그래서 그 파일로 가서webpack.config.js
또는webpack.renderer.config.js
필요에 따라 Vue를 에서 삭제합니다.externals
그러면 다시 작동하게 됩니다.
자세한 내용은 이쪽입니다.
Import Vue를 Header_Component의 'vue'에서 제거합니다.표시하다
언급URL : https://stackoverflow.com/questions/52213260/vue-warn-attrs-is-readonly-vue-warn-listeners-is-readonly
'source' 카테고리의 다른 글
vuex 작업 - 서로 후속 작업에 페이로드를 디스패치할 수 없음 (0) | 2022.08.27 |
---|---|
C/C++ 소스 코드 시각화 (0) | 2022.08.27 |
포인터를 선언합니다.유형과 이름 사이의 공백 왼쪽 또는 오른쪽에 아스타리스크가 표시됩니까? (0) | 2022.08.27 |
고방사능 환경에서 사용하기 위한 애플리케이션 컴파일 (0) | 2022.08.27 |
VueJs: TypeError: Object(...)가 함수가 아닙니다. "withScopeId" (0) | 2022.08.27 |