Vue.js 使用 Vuex 和自定义组件,@click方法输出未定义
Vue.js with Vuex, and custom components, @click method outputs undefined
我有一个菜单,除了三个按钮外,还有关于、新闻和联系按钮,这些按钮允许更改菜单按钮上的标签语言和文本元素的内容(变量contentText
如下)。
我正在使用带有自定义组件的 Vue.js 以及 Vuex.js 来存储语言状态。我可以在菜单按钮上选择标签的语言。例如,如果我单击标有 fr 的按钮,meny 栏上的标签会从大约变为 à propos,从新闻变为新消息等,但由于某种我无法识别的原因,当我单击任何一个菜单按钮时,单击事件不会触发相应文本元素的可见性。处理状态的代码大致如下(此处为 Jsfiddle):
Vue.use(Vuex)
var storelang = new Vuex.Store({
state: {
lang: {}
},
actions: {
lang: 'code'
},
mutations: {
code(state, ln) {
var jsontext = '{"aboutMenu":"About", "aboutText":"This is just a small text in English.", "newsMenu":"News", "newsText":"News written in the English language.", "contactMenu":"Contact", "contactText":"Contact info written in English."}'
if (ln === 'pt') {
jsontext = '{"aboutMenu":"Sobre", "aboutText":"Isto é um pequeno texto em Português.", "newsMenu":"Novidades", "newsText":"Novidades escritas em Português.", "contactMenu":"Contactar", "contactText":"Informação de contacto escrita em Português."}'
}
if (ln === 'fr') {
jsontext = '{"aboutMenu":"À propos", "aboutText":"Ceci est juste um petit texte en Français.", "newsMenu":"Nouvelles", "newsText":"Des nouvelles écrites en Français.", "contactMenu":"Contacter", "contactText":"Des informations dans la langue Française."}'
}
state.lang = JSON.parse(jsontext)
}
},
strict: true
})
组件及其各自的模板,使用 Vue.extend
创建:
var contentBtn = Vue.extend({
template: '<button type="button" class="btn btn-default" @click="toggleAbout">{{lang.aboutMenu}}</button><button type="button" class="btn btn-default" @click="toggleNews">{{lang.newsMenu}}</button><button type="button" class="btn btn-default" @click="toggleContact">{{lang.contactMenu}}</button>'
})
var contentTxt = Vue.extend({
template: '<div v-show="aboutIsVisible">{{lang.aboutText}}</div><div v-show="newsIsVisible">{{lang.newsText}}</div><div v-show="contactIsVisible">{{lang.contactText}}</div>'
})
var langBtn = Vue.extend({
template: '<button type="button" class="btn btn-info" @click.prevent=activate("en")>en</button><button type="button" class="btn btn-info" @click.prevent=activate("pt")>pt</button><button type="button" class="btn btn-info" @click.prevent=activate("fr")>fr</button>',
methods: {
activate: function(x) {
storelang.actions.lang(x)
}
},
ready: function() {
return storelang.actions.lang('en') //default language
}
})
还有我的Vue
实例,我在其中存储有关文本元素可见性的值,注册组件并声明单击事件的方法:
new Vue({
el: '#app',
data: {
aboutIsVisible: true,
newsIsVisible: true,
contactIsVisible: true
},
components: {
'langbtn': langBtn,
'contentbtn': contentBtn,
'contenttxt': contentTxt
},
methods: {
toggleAbout: function () {
this.aboutIsVisible = !this.aboutIsVisible
},
toggleNews: function () {
this.newsIsVisible = !this.newsIsVisible
},
toggleContact: function () {
this.contactIsVisible = !this.contactIsVisible
}
}
})
我错过了什么?
您正在尝试在没有名为 toggleNews
的方法的子组件上调用 toggleNews
。 该方法位于父组件上。 您需要将按钮移动到父元素中,或利用事件将点击从子元素广播到父元素。
我将子模板上移到父模板中,您的代码按预期工作:https://jsfiddle.net/674z6w0h/13/
相关文章:
- 使用click()方法是在创建一个无休止的循环
- jQuery AJAX$.post无法使用.click()方法
- 有没有一种不那么黑客的方法可以防止我的 on('click') 触发两次
- Vue.js 使用 Vuex 和自定义组件,@click方法输出未定义
- Jquery change() 方法在 click(x+2) 上重复
- ng-click 或 ng-submit 不调用控制器方法
- casperjs,可能需要另一个click方法
- UFT在使用Web加载项时如何执行Click方法
- javascript click()方法的问题/ html
- 即使元素被禁用,selenium click()方法也能工作吗?
- 使用click()方法使用隐藏的文件输入元素
- 当动态创建时,Click()方法不会触发锚上的Click事件
- 我想从jQuery.click()方法传递一个参数
- 使用 Click 方法导入所有 XML 属性值
- 将多个参数传递给 ng-click 方法
- Javascript:使用.click方法时出现问题
- Jquery .click方法失败
- Javascript .click()方法在某些情况下不能在android上工作
- 调用controlgroup .click()方法
- 在click方法内绑定事件