JSON 数据中的 Vue v-links
Vue v-links in JSON data
我对 Vue 比较陌生,如果这是显而易见的(或显然不可能的),请原谅我。
我有一组 JSON 数据(通过 vue-resource 从 RESTful API 中获取):
{content: "This is content. <a href='/blog'> Link to blog </a>"}
现在,link 触发页面重新加载。如果它是一个 vue-router v-link
,那将不是问题。但是,这不起作用(当然,引号在数据中被转义):
{content: "This is content. <a v-link="{ path: '/blog' }"> Link to blog </a>"}
此时,模板已经被解析,Vue 将不再创建 v-link(它只会在渲染的 [= 中显示为 v-link 30=]).
我的最终结果理想情况下意味着我可以在我的 CMS 中包含 HTML 或 Vue 格式的 link,并让 Vue 将它们正确路由为 v-link秒。
我可以做些什么让 Vue 解释 JSON 数据中的 link 吗?
我已经回答了 Vue Chat 上的问题,并写在这里以防其他人遇到类似问题
上的简化示例
HTML
<div id="app">
<div>
<a v-link= "{path:'/home'}">Go to home</a>
</div>
<router-view></router-view>
</div>
<template id="home">
<div>
<div>
Fetched Content:
</div>
<div>
{{{ fetchedContent }}}
</div>
</div>
</template>
<template id="route1">
<div>
Route1 view
</div>
</template>
<template id="route2">
<div>
Route2 view, this is different from Route1
</div>
</template>
javascript
function getContent (callback) {
var content = 'Click this: <a href="/route1">Go to route1</a> and <a href="/route2">Go to route2</a>'
setTimeout(function () { callback(content) }, 1000)
}
var Home = Vue.component('home',{
template:'#home',
data: function () {
return {
fetchedContent: 'Loading...'
};
},
ready: function () {
var self = this
var router = this.$router
getContent( function (result) {
self.fetchedContent = result;
Vue.nextTick(function () {
var hyperLinks = self.$el.getElementsByTagName('a')
Array.prototype.forEach.call(hyperLinks, function (a) {
a.onclick = function (e) {
e.preventDefault()
router.go({ path: a.getAttribute("href") })
}
})
})
})
}
});
var Route1 = Vue.component('route1', {
template: '#route1'
});
var Route2 = Vue.component('route2', {
template: "#route2"
});
var router = new VueRouter({
hashbang:false,
history:true
});
router.map({
'/home':{
component:Home
},
'/route1':{
component:Route1
},
'/route2':{
component:Route2
}
});
router.start({
}, '#app');
我在这里有一个类似的解决方案:question 在我的 JSON 代码中使用自定义数据集和点击侦听器来处理它:
mounted() {
window.addEventListener('click', event => {
let target = event.target
if (target && target.href && target.dataset.url) {
event.preventDefault();
console.log(target.dataset.url);
const url = JSON.parse(target.dataset.url);
console.log(url.name)
this.$router.push(url.name);
}
});
},
我对 Vue 比较陌生,如果这是显而易见的(或显然不可能的),请原谅我。
我有一组 JSON 数据(通过 vue-resource 从 RESTful API 中获取):
{content: "This is content. <a href='/blog'> Link to blog </a>"}
现在,link 触发页面重新加载。如果它是一个 vue-router v-link
,那将不是问题。但是,这不起作用(当然,引号在数据中被转义):
{content: "This is content. <a v-link="{ path: '/blog' }"> Link to blog </a>"}
此时,模板已经被解析,Vue 将不再创建 v-link(它只会在渲染的 [= 中显示为 v-link 30=]).
我的最终结果理想情况下意味着我可以在我的 CMS 中包含 HTML 或 Vue 格式的 link,并让 Vue 将它们正确路由为 v-link秒。
我可以做些什么让 Vue 解释 JSON 数据中的 link 吗?
我已经回答了 Vue Chat 上的问题,并写在这里以防其他人遇到类似问题
上的简化示例HTML
<div id="app">
<div>
<a v-link= "{path:'/home'}">Go to home</a>
</div>
<router-view></router-view>
</div>
<template id="home">
<div>
<div>
Fetched Content:
</div>
<div>
{{{ fetchedContent }}}
</div>
</div>
</template>
<template id="route1">
<div>
Route1 view
</div>
</template>
<template id="route2">
<div>
Route2 view, this is different from Route1
</div>
</template>
javascript
function getContent (callback) {
var content = 'Click this: <a href="/route1">Go to route1</a> and <a href="/route2">Go to route2</a>'
setTimeout(function () { callback(content) }, 1000)
}
var Home = Vue.component('home',{
template:'#home',
data: function () {
return {
fetchedContent: 'Loading...'
};
},
ready: function () {
var self = this
var router = this.$router
getContent( function (result) {
self.fetchedContent = result;
Vue.nextTick(function () {
var hyperLinks = self.$el.getElementsByTagName('a')
Array.prototype.forEach.call(hyperLinks, function (a) {
a.onclick = function (e) {
e.preventDefault()
router.go({ path: a.getAttribute("href") })
}
})
})
})
}
});
var Route1 = Vue.component('route1', {
template: '#route1'
});
var Route2 = Vue.component('route2', {
template: "#route2"
});
var router = new VueRouter({
hashbang:false,
history:true
});
router.map({
'/home':{
component:Home
},
'/route1':{
component:Route1
},
'/route2':{
component:Route2
}
});
router.start({
}, '#app');
我在这里有一个类似的解决方案:question 在我的 JSON 代码中使用自定义数据集和点击侦听器来处理它:
mounted() {
window.addEventListener('click', event => {
let target = event.target
if (target && target.href && target.dataset.url) {
event.preventDefault();
console.log(target.dataset.url);
const url = JSON.parse(target.dataset.url);
console.log(url.name)
this.$router.push(url.name);
}
});
},