问题原因:
Vue2.0 不再支持在 v-html 中使用过滤器
解决方法:
1: 全局方法(推介)
2: computed 属性
3: $options.filters(推介)
具体用法如下一页:
2
1:使用全局方法
可以在 Vue 上定义全局方法:
Vue.prototype.msg= function (msg) {
return msg.replace("\n", "<br>")
};
然后所有地方上都可以直接用这个方法了:
<p v-html="msg(content)"></p>
3
2 : computed 属性
var appMain= new Vue({
el: '#appMain',
computed :{
content: function (msg) { return msg.replace("\n", "<br>")
},
},
data: {
content: "XXXXX"
}
})
页面上:
<p>{{content}}</p>
4
3: $options.filters
在定义的vue里的filter添加方法:
var appMain= new Vue({
el: '#appMain',
filters:{
msg: function(msg) {
return msg.replace(/\n/g, "<br>") ;
}
},
data: {
content: "XXXXX"
}
})
然后页面上都可以直接用这个方法了:
<p id="appMain">
<p v-html="$options.filters.msg(content)"></p>
</p>
vue在html中的使用
是一个注册需求,要求用户在注册的时候需要填写注册信息并上传“营业执照”等信息。表单内容需进行验证及必填项提示,图片需要和信息一起传递且图片载入后需可预览。既然是注册我们当然是用form表单来提交了,对应的ElementUI组件标签则是el-form。
从上面的图可以看出注册环节分为了两部分数据,左边是注册时需求提交的表单信息,右边是需求上传的图片。先来解决左边的表单数据,el-form是ElementUI封装的表单组件,可以收集、校验和提交数据。el-form中的model用来绑定表单数据对象,el-form-item中的prop为model对象中传递的字段,el-input中的v-model绑定的是该字段对应的属性值。
input的name属性是用来定义input元素的名称,只有设置了 name 属性的表单元素才能在提交表单时传递它们的值。input的value属性的type属性来决定,type属性属性可以是button、reset、submit、text、password、hidden、checkbox、radio、image、file等。el-upload组件就是封装的type属性为file的input,并提供了before-upload、on-progress、on-success、on-error、on-preview、on-remove等钩子函数来获取上传过程中的属性状态等信息。
ElementUI提供了表单验证的规则,可以通过rules属性来定义对应el-form-item中的验证规则(支持多个规则验证)。当然如果觉得ElementUI提供的表单验证功能无法满足项目需求我们也可以自定义验证规则。通过validator属性调用自定义的校验方法,自定义校验callback必须被调用。自定义校验规则可以参考文章【Vue实战084:自定义表单校验规则及常用表单校验分享 】,我将一些常用的校验都写在了一起方便后续直接使用。
ElementUI提供了一个封装好的<input type='file'>的上传组件el-upload,封装了文件上传的一系列钩子函数,可以监听文件上传过程中的所有事件。el-upload连请求也封装了,只要通过action提供请求路径(后端文件的上传地址)就可以将文件直接上传到服务器。
根据自己的需求设计一个文件样式,这里我用虚拟边框来显示文件上传区域。中间放个图标来触发input选框,图片文件上传后就可以直接在当前区域进行预览。
在el-upload中定义属性:auto-upload="false" 可以禁止文件自动上传,既然禁止了自动上传那么我们就需要拿到文件对象。通过upload组件的on-change属性我们可以监听文件添加、上传时的状态改变,利用该属性触发自定义事件可以获取到需要的文件属性。利用window.createObjectURL(e.raw)创建图片地址实现本地预览,如果fileList长度大于0说明已经上传了图片这时我们就通过clearValidate去掉校验提示。
有文件的form表单上传数据要用formData类型,我们需要创建一个 FormData 对象来接收文件数据。选择了图片并填写必填信息之后点击【注册】按钮发起注册请求,在register 方法里把表单信息通过append将数据添加到formData中。然后利用axios向后台发起注册请求并发送注册信息,res为返回的请求结果。
这里主要是多了图片的手动上传,el-upload组件默认会自动上传提交的文件。这里要求图片不允许自动上传,需要和信息一起在提交的时候进行传递。以上内容是小编给大家分享的【Vue实战085:el-form实现表单和图片手动上传和校验】,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。更多Vue实战技巧可以参考以下专栏:
为了方便学习,下面附上本文用到的源码:
、实例与数据
Vue.js 应用的创建很简单,通过构造函数 Vue 就可以创建一个 Vue 的根实例,并启动 Vue 应用:
var app = new Vue ({ //选项 })
变量 app 就代表了这个 Vue 实例。事实上,几乎所有的代码都是一个对象,写入 Vue 实例的选项内的。首先,必不可少的一个选项就是 el 。el 用于指定一个页面已存在的 DOM 元素来挂载 Vue 实例,它可以是 HTMLElement ,也可以是 CSS 选择器,比如:
<div id="app"></div> var app = new Vue({ el: document.getElementById('app') // 或者 el:'#app' })
挂载成功后,可以通过 app.$el 来访问该元素。Vue 提供了很多常用的实例属性与方法,都以 $ 开头,比如 $el 。
<div id="app"> <input type="text" v-model="name" placeholder="请输入你的名字"> <h1>Vue.js 最核心功能:数据的双向绑定 —— {{ name }}</h1> </div> <script> var app = new Vue ({ el: '#app', data: { name: '' } }) </script>
上述代码,在 input 标签上,有一个 v-model 的指令,它的值对应于创建的 Vue 实例的 data 选项中的 name 字段,这就是 Vue 的数据绑定。通过 Vue 实例的 data 选项,可以声明应用内需要双向绑定的数据。建议所有会用到的数据都预先在 data 内声明,这样不至于将数据散落在业务逻辑中,难以维护。
Vue 实例本身也代理了 data 对象里的所有属性,故可以这样访问:
var app = new Vue({ el: "#app", data: { a: 1 } }) sonsole.log(app.a); //1
除了显式地声明数据外,也可以指向一个已有的变量,并且它们之间默认建立了双向绑定,当修改其中任意一个时,另一个也会一起变化:
var myData = { a: 1 } var app = new Vue({ el: "#app", data: { a: myData } }) sonsole.log(app.a); // 1 // 修改属性,原数据也会随之修改 app.a = 2; console.log(myData.a); // 2 // 反之,修改原数据,Vue 属性也会修改 myData.a = 3; console.log(app.a); // 3
每个 Vue 实例创建时,都会经历一系列的初始化过程,同时也会调用相应的生命周期钩子,我们可以利用这些钩子,在合适的时机执行我们的业务逻辑。如果你使用过 jQuery ,一定知道它的 ready() 方法,比如:
$(document).ready(function() { // DOM 加载完后,会执行这里的代码 });
Vue 的生命周期钩子与之类似,比较常用的有:
这些钩子与 el 和 data 类似,也是作为选项写入 Vue 实例内,并且钩子的 this 指向的是调用它的 Vue 实例:
var app - new Vue({ el: '#app', data: { a: 2 }, created: function () { console.log(this.a); // 2 } mounted: function () { console.log(this.$el); // <div id="app"></div> } })
使用双大括号( Mustache 语法 )“ {{ }} ” 是最基本的文本插值方法,它会自动将我们双向绑定的数据实时显示出来,例如实时显示当前时间,每秒更新:
<script> var app = new Vue ({ el: '#app', data: { date: new Date() }, mounted: function () { var _this = this; // 声明一个变量指向 Vue 实例 this, 保证作用域一致 this.timer = setInterval(function() { _this.date = new Date(); // 修改数据 date }, 1000); // 1秒 }, beforeDestroy: function () { if (this.timer) { clearInterval(this.timer); // 在 Vue 实例销毁前,清除我们的定时器 } } }) </script>
双大括号里的内容会被替换为 data 选项中 date 的值,通过任何方法修改数据 data 选项中 date 的值,双大括号的内容都会被实时替换。这里的 {{ date }} 输出的是浏览器默认的时间格式,并非格式化的时间( 2018-10-07 10:05:59 ),所以需要注意时区。有多种方法可以对时间格式化,比如赋值前先使用自定义的函数处理。当然,Vue 的过滤器 ( filter )或计算属性 ( computed )也可以实现。
如果有时候就是想输出 HTML,而不是将数据解释后的纯文本,可以使用 v-html:
<div id="app"> <span v-html="link"></span> </div> <script> var app = new Vue({ el: '#app', data: { link: '<a href="https://www.baidu.com/">百度</a>' } }) </script>
link 的内容将会被渲染为一个具有点击功能的 a 标签,而不是纯文本。但是要注意,如果将用户产生的内容使用 v-html 输出后,有可能导致 XSS 攻击(跨站脚本攻击),所以要在服务端对用户提交的内容进行处理,一般可将尖括号 “<>” 转义。
如果想显示 {{ }}标签,而不进行替换,使用 v-pre 即可跳过这个元素和它的子元素的编译过程,例如:
<span v-pre>{{ 这里会显示双花括号,内容不会被编译 }}</span>
在 {{ }} 中,除了简单的绑定属性值外,还可以使用 JavaScript 表达式进行简单的运算、三元运算等,例如:
<div id="app"> {{ num / 100 }} {{ areYouOK ? '确定' : '取消' }} {{ text.split(',').reverse().join(',') }} </div> <script> var app = new Vue({ el: '#app', data: { num: 100, areYouOK:false, text: '123,456' } }) </script>
显示结果依次为:1、取消、456,123 。
Vue.js 只支持单个表达式,不支持语句和流控制。另外,在表达式中,不能使用用户自定义的全局变量,只能使用 Vue 白名单内的全局变量,例如 Math 和 Date 。以下是一些无效的示例:
<!-- 这是语句,不是表达式 --> {{ var text = '123,456' }} <!-- 不能使用流控制,要使用三目运算 --> {{ if (areYouOK) return msg }}
Vue.js 支持在 {{ }} 插值的尾部添加一个管道符“ ( | ) ” 对数据进行过滤,经常用于格式化文本,比如字母全部大写、货币千位使用逗号分隔等。过滤的规则是自定义的,通过给 Vue 实例添加选项 filters 来设置,例如可以对时间进行格式化处理,实时显示当前时间:
<div id="app"> {{ date | formatDate }} </div> <script> // 在月份、日期、小时等小于 10 时前面补 0 var padDate = function(value) { return value < 10 ? '0' + value : value; }; var app = new Vue({ el: "#app", data: { date: new Date() }, filters: { formatDate: function (value) { // 这里的 value 就是需要过滤的数据 var date = new Date(value); var yaer = date.getFullYear(); var month = padDate(date.getMonth() + 1); var day = padDate(date.getDate()); var hours = padDate(date.getHours()); var minutes = padDate(date.getMinutes()); var seconds = padDate(date.getSeconds()); // 整理返回格式化后的日期 return yaer + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds; } }, mounted: function () { var _this = this; // 声明一个变量指向 Vue 实例 this , 保证作用域一致 this.timer = setInterval({ _this.date = new Date(); // 修改数据 date }, 1000); }, beforeDestroy: function() { if (this.timer) { clearInterval(this.timer); // 在 Vue 实例销毁前,清除我们的定时器 } } }) </script>
过滤器也可以串联,而且可以接收参数,例如:
<!-- 串联 --> {{ message | filterA | filterB }} <!-- 接收参数 --> {{ message | filterA('arg1', 'arg2') }}
过滤器应当用于处理简单的文本转换,如果要实现更为复杂的数据变换,应该使用计算属性。
*请认真填写需求信息,我们会在24小时内与您取得联系。