使用 Vue 查找表情符号 table
if-emoji lookup table with Vue
我正在使用 npm 模块 if-emoji
来检测用户是否可以查看表情符号。 Modernizr 中有一个类似的工具。
如果用户无法查看表情符号,我会改为显示表情符号的图像。所以我的 Vue HTML 看起来像这样:
<h2 v-if="this.emojis"></h2>
<h2 v-if="!this.emojis"><img src="https://example.com/emoji.png">/h2>
这是否仍然为可以查看表情符号的用户下载图像,因此不必要地使用带宽?
有没有更有效的方法,这样我就不需要在每次使用表情符号时都去添加 v-if
?如果有表情符号和 !this.emojis
,是否可以进行某种查找 table?
这也应该有效:
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<h2 v-if="true"></h2>
<h2 v-else><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/SNice.svg/1200px-SNice.svg.png" width=15 height=15></h2>
<h2 v-if="false"></h2>
<h2 v-else><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/SNice.svg/1200px-SNice.svg.png" width=15 height=15></h2>
如果语句为真,v-if
部分仅是源代码的一部分 - 否则将使用 else 语句。如果 img 标签不是加载源的一部分,则不会加载图像。
<h2 v-if="emojis"></h2>
<h2 v-else><img src="https://example.com/emoji.png"></h2>
可能是 @Patrick Artner 指出的改进代码的唯一方法。
模板中不需要this.
对于图片未显示是否加载的问题,简单的答案是否定的。 Vue 仅在需要时渲染 v-ifs
而不会渲染它 - 图像仅在 !emojis
.
时加载
您也可以通过创建自己的 vue.component
来解决这个问题
<emojiorimage usesmily="false" smily="" imgpath="https://i.stack.imgur.com/QdqVi.png"></emojiorimage>
它封装了决定是图像还是笑脸本身。
var app = new Vue({
el: "#app",
data: function(){
return {
extendedCost: 0,
}
},
components: { "emojiorimage" : {
template : `
<h2>
usesmily is {{usesmily}}<br/>
<div v-if="usesmily === 'true'">{{ smily }}</div>
<div v-else><img :scr="imgpath" width="50" height="50" :alt="imgpath" /></div>
</h2>`,
props: ["usesmily", "smily", "imgpath"],
}}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<h1>Emoji or Image</h1>
<emojiorimage
usesmily="false"
smily=""
imgpath="https://i.stack.imgur.com/QdqVi.png"
></emojiorimage>
<emojiorimage
usesmily="true"
smily=""
imgpath="https://i.stack.imgur.com/QdqVi.png"
></emojiorimage>
</div>
然后您可以从您查询一次并存储在某处的 npm 包中为它提供 isemoji。
对于单独的 vue 文件,它看起来有点像这样:
emojiorimage.vue
<template>
<h2>
<div v-if="usesmily === 'true'">{{ smily }}</div>
<div v-else><img :scr="imgpath" width="50" height="50"
:alt="imgpath" /></div>
</h2>
</template>
<script>
export default {
props: ["usesmily", "smily", "imgpath"],
};
</script>
App.vue
<template>
<div id="app">
<h1>Emoji or Image</h1>
<emojiorimage
usesmily="false"
smily=""
imgpath="https://i.stack.imgur.com/QdqVi.png"
/>
<emojiorimage
usesmily="true"
smily=""
imgpath="https://i.stack.imgur.com/QdqVi.png"
/>
</div>
</template>
<script>
import emojiorimage from "./components/emojiorimage.vue";
export default {
components: {
emojiorimage,
},
};
</script>
index.html
<div id="app"></div>
index.js
import Vue from "vue";
import App from "./App";
Vue.config.productionTip = false;
new Vue({
el: "#app",
template: "<App/>",
components: { App }
});
得到:
学习资源:
感谢@PatrickArtner 发布了使用 Vue 组件渲染表情符号/图像的想法。这是我的最终解决方案,它调整表情符号/图像的大小以适应周围的文本——它使用 fitty
调整表情符号的大小,并将图像设置为 height:1em;
.
Emoji.vue
<template>
<div class="emojiContainer">
<span id="fittyEmoji" v-if="emojis">{{ insert }}</span>
<img v-if="!emojis" :src="insert" class="emojiImage">
</div>
</template>
<style scoped>
.emojiContainer {
display: inline;
}
.emojiImage {
height:1em;
}
</style>
<script src="fitty.min.js"></script>
<script>
import fitty from 'fitty';
import ifEmoji from 'if-emoji'
export default {
name: 'Emoji',
props: ['name'],
data: function() {
return {
insert: "",
emojis: false,
}
},
methods: {
insertEmoji(){
var names = ['frog', 'fire']
var emojis = ['','']
var urls = ['https://example.com/frog.png',
'https://example.com/fire.png']
if (this.emojis) {
this.insert = emojis[names.indexOf(this.name)];
} else {
this.insert = urls[names.indexOf(this.name)];
}
fitty('#fittyEmoji')
}
},
beforeMount() {
if (ifEmoji('')) {
this.emojis = true;
} else {
this.emojis = false;
}
this.insertEmoji();
}
}
</script>
然后在你的父组件中你可以像这样插入:
<template>
<div id="app">
<h1><Emoji name='frog'/> Frog Facts</h1>
<p>Lorem ipsum <Emoji name='fire'/><p>
</div>
</template>
<script>
import Emoji from '@/components/Emoji.vue'
export default {
components: {
Emoji,
},
};
</script>
我正在使用 npm 模块 if-emoji
来检测用户是否可以查看表情符号。 Modernizr 中有一个类似的工具。
如果用户无法查看表情符号,我会改为显示表情符号的图像。所以我的 Vue HTML 看起来像这样:
<h2 v-if="this.emojis"></h2>
<h2 v-if="!this.emojis"><img src="https://example.com/emoji.png">/h2>
这是否仍然为可以查看表情符号的用户下载图像,因此不必要地使用带宽?
有没有更有效的方法,这样我就不需要在每次使用表情符号时都去添加 v-if
?如果有表情符号和 !this.emojis
,是否可以进行某种查找 table?
这也应该有效:
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<h2 v-if="true"></h2>
<h2 v-else><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/SNice.svg/1200px-SNice.svg.png" width=15 height=15></h2>
<h2 v-if="false"></h2>
<h2 v-else><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/SNice.svg/1200px-SNice.svg.png" width=15 height=15></h2>
如果语句为真,v-if
部分仅是源代码的一部分 - 否则将使用 else 语句。如果 img 标签不是加载源的一部分,则不会加载图像。
<h2 v-if="emojis"></h2>
<h2 v-else><img src="https://example.com/emoji.png"></h2>
可能是 @Patrick Artner 指出的改进代码的唯一方法。
模板中不需要this.
对于图片未显示是否加载的问题,简单的答案是否定的。 Vue 仅在需要时渲染 v-ifs
而不会渲染它 - 图像仅在 !emojis
.
您也可以通过创建自己的 vue.component
来解决这个问题<emojiorimage usesmily="false" smily="" imgpath="https://i.stack.imgur.com/QdqVi.png"></emojiorimage>
它封装了决定是图像还是笑脸本身。
var app = new Vue({
el: "#app",
data: function(){
return {
extendedCost: 0,
}
},
components: { "emojiorimage" : {
template : `
<h2>
usesmily is {{usesmily}}<br/>
<div v-if="usesmily === 'true'">{{ smily }}</div>
<div v-else><img :scr="imgpath" width="50" height="50" :alt="imgpath" /></div>
</h2>`,
props: ["usesmily", "smily", "imgpath"],
}}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<h1>Emoji or Image</h1>
<emojiorimage
usesmily="false"
smily=""
imgpath="https://i.stack.imgur.com/QdqVi.png"
></emojiorimage>
<emojiorimage
usesmily="true"
smily=""
imgpath="https://i.stack.imgur.com/QdqVi.png"
></emojiorimage>
</div>
然后您可以从您查询一次并存储在某处的 npm 包中为它提供 isemoji。
对于单独的 vue 文件,它看起来有点像这样:
emojiorimage.vue
<template>
<h2>
<div v-if="usesmily === 'true'">{{ smily }}</div>
<div v-else><img :scr="imgpath" width="50" height="50"
:alt="imgpath" /></div>
</h2>
</template>
<script>
export default {
props: ["usesmily", "smily", "imgpath"],
};
</script>
App.vue
<template>
<div id="app">
<h1>Emoji or Image</h1>
<emojiorimage
usesmily="false"
smily=""
imgpath="https://i.stack.imgur.com/QdqVi.png"
/>
<emojiorimage
usesmily="true"
smily=""
imgpath="https://i.stack.imgur.com/QdqVi.png"
/>
</div>
</template>
<script>
import emojiorimage from "./components/emojiorimage.vue";
export default {
components: {
emojiorimage,
},
};
</script>
index.html
<div id="app"></div>
index.js
import Vue from "vue";
import App from "./App";
Vue.config.productionTip = false;
new Vue({
el: "#app",
template: "<App/>",
components: { App }
});
得到:
学习资源:
感谢@PatrickArtner 发布了使用 Vue 组件渲染表情符号/图像的想法。这是我的最终解决方案,它调整表情符号/图像的大小以适应周围的文本——它使用 fitty
调整表情符号的大小,并将图像设置为 height:1em;
.
Emoji.vue
<template>
<div class="emojiContainer">
<span id="fittyEmoji" v-if="emojis">{{ insert }}</span>
<img v-if="!emojis" :src="insert" class="emojiImage">
</div>
</template>
<style scoped>
.emojiContainer {
display: inline;
}
.emojiImage {
height:1em;
}
</style>
<script src="fitty.min.js"></script>
<script>
import fitty from 'fitty';
import ifEmoji from 'if-emoji'
export default {
name: 'Emoji',
props: ['name'],
data: function() {
return {
insert: "",
emojis: false,
}
},
methods: {
insertEmoji(){
var names = ['frog', 'fire']
var emojis = ['','']
var urls = ['https://example.com/frog.png',
'https://example.com/fire.png']
if (this.emojis) {
this.insert = emojis[names.indexOf(this.name)];
} else {
this.insert = urls[names.indexOf(this.name)];
}
fitty('#fittyEmoji')
}
},
beforeMount() {
if (ifEmoji('')) {
this.emojis = true;
} else {
this.emojis = false;
}
this.insertEmoji();
}
}
</script>
然后在你的父组件中你可以像这样插入:
<template>
<div id="app">
<h1><Emoji name='frog'/> Frog Facts</h1>
<p>Lorem ipsum <Emoji name='fire'/><p>
</div>
</template>
<script>
import Emoji from '@/components/Emoji.vue'
export default {
components: {
Emoji,
},
};
</script>