vue-3d-model
vue.js 3D model viewer component, based on threejs, inspired by model-tag
一个展示三维模型的Vue组件,支持模型操作和模型点击事件,能自动缩放模型到合适大小并校正偏移,支持多种格式的模型。
Example
Install
using npm
vue-3d-model
vue.js 3D model viewer component, based on threejs, inspired by model-tag
一个展示三维模型的Vue组件,支持模型操作和模型点击事件,能自动缩放模型到合适大小并校正偏移,支持多种格式的模型。
Example
Install
using npm
npm install vue-3d-model --save
Or using script tag for global use
<script src="https://unpkg.com/vue-3d-model/dist/vue-3d-model.min.js"></script>
Or Download vue-3d-model.min.js and include it in your html
Usage
<template> <model-obj src="example/models/obj/LeePerrySmith.obj"></model-obj> </template> <script> import { ModelObj } from 'vue-3d-model' export default { components: { ModelObj } } </script>
Or
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <div id="app"> <model-obj src="example/models/obj/LeePerrySmith.obj"></model-obj> </div> <script src="vue.js"></script> <script src="vue-3d-model.min.js"></script> <script> new Vue({ el: '#app' }) </script> </body>
Documents
props
prop | type | default | example |
---|---|---|---|
src | string | - | './exapmle.obj' |
width | number | - | 300 |
height | number | - | 300 |
position | object | { x: 0, y: 0, z: 0 } | { x: 100, y: 20, z: -10 } |
rotation | object | { x: 0, y: 0, z: 0 } | { x: Math.PI / 2, y: 0, z: - Math.PI / 4 } |
scale | object | { x: 1, y: 1, z: 1 } | { x: 2, y: 2, z: 3 } |
lights | array | - | |
backgroundColor | number/string | 0xffffff | 0xffffff/'#f00'/'rgb(255,255,255)' |
backgroundAlpha | number | 1 | 0.5 |
controllable | boolean | true | true/false |
event |
---|
on-mousedown |
on-mousemove |
on-mouseup |
on-click |
on-load |
on-progress |
on-error |
model format | component tag |
---|---|
obj | <model-obj> |
json | <model-three> |
stl | <model-stl> |
dae | <model-collada> |
ply | <model-ply> |
gltf(2.0) | <model-gltf> |
Modern browsers and IE 11.
You can click on this for more information
MIT
vue3自定义组件v-model实例
注意:我这里是typescript的语法,只是有个别地方和js相比要确定一下类型,比如函数传参时,和使用input元素的value时
父组件App.vue
<template> <div> <InputModel v-model="inputVal"/> <span>{{inputVal}}</span> </div> </template> <script lang="ts"> import { defineComponent,ref } from 'vue'; import InputModel from './components/InputModel.vue' export default defineComponent({ name: 'App', components: { InputModel, }, setup(){ const inputVal = ref('hello') return{ inputVal } } }); </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
子组件 InputModel.vue
<template> <div> <input type="text" @input="updateVal" :value="changeVal" /> </div> </template> <script lang="ts"> import { defineComponent , ref} from 'vue'; export default defineComponent({ props:{ modelValue:String, }, setup(props,context){ // console.log(props.modelValue); const changeVal = ref(props.modelValue) const updateVal = (e: KeyboardEvent)=>{ // console.log((e.target as HTMLInputElement).value); //获取到input元素里面的值, const targetVal = (e.target as HTMLInputElement).value // console.log(changeVal.value); // 令两个值相等(传过来的值和输入的值) changeVal.value = targetVal // 发送事件和值 context.emit('update:modelValue',targetVal) } return{ updateVal, changeVal } } }); </script>
vue3自定义v-model的优点(较vue2)
不知道vue2的自定义v-model的可以点击:
vue一些高级特性
的第一栏目观看vue2的缺点:
vue3的提升:
今天在看vue-property-decorator时,遇到了@Model选项,也就是vue2.2中新增的实例model选项。原来只知道v-model属性实现双向绑定,对这个model选项突然不是很理解。所以这里重新对v-model和自定义组件的v-model做一个回顾,加深印象后,再去理解model选项到底是做什么的,有什么作用。
vue中的v-model指令实现了表单的双向绑定,这是官网的一个栗子:
<input type="text" v-model="message"> <p>{{message}}</p>
v-model只是语法糖,真正的实现形式:
<input type="text" :value="message" @input="message = $event.target.value">
1.将输入框的值绑定到message变量上,这只是单向的,改变message的值可以改变input的value,但是改变input的输入不会改变message。
2.监听input事件,当输入类内容时改变message变量,从而实现了双向绑定。
从官网上看到,v-model在内部为不同的输入元素使用不同的属性并抛出不同的事件:
text和textarea元素使用value属性和input事件
checkbox和radio使用checked属性和change事件
select使用value和change事件
那么我们知道原理后,可以试着实现自定义输入框组件的v-model,即双向绑定
// js部分 Vue.component('custom-input',{ // 1.监听input,输入时触发自定义组件内部的updateVal事件 template: `<input :value='value' @input='updateVal($event.target.value)' type='text'></input>`, // 5.通过props传递,实现父组件值绑定到输入框的value props: ['value'], methods: { // 2.触发父组件上的input事件 updateVal(val){ this.$emit('input', val); } } }); var app = new Vue({ el: '#app', data(){ price: '' }, methods: { // 3.传递过来的值赋给父组件的price变量,实现了输入框到父元素的单向绑定 onInput(val){ this.price = val; } } })
// HTML部分 <div id="app"> // 4.父组件的value值绑定到price <price-input :value="price" @input="onInput"></price-input> </div>
通过上面的分析,默认情况下,一个组件上的
v-model
会把value
用作 prop 且把input
用作 event。所以当我们在一个自定义组件上使用v-model并不能实现双向绑定,因为自定的组件并没有默认的value和input事件,在使用时,我们需要按照上面那样显式的去声明定义这些东西。这时,model选项就派上用场了,在定义组件的时候,指定prop的值和监听的事件。Vue.component('my-input',{ model: { prop: 'uname', // 随便命名事件,对应下面$emit即可 event: 'changeXXX' }, props: { uname: { type: String, default: 'tom' } }, methods: { updateVal(val){ this.$emit('changeXXX',val) } } })
<template> <input type="text" :value="uname" @input="updateVal($event.target.value)"> </template>
父组件内使用时,使用v-model就可以啦
// name是父组件中的属性 <my-input v-model="name" value="some value"></my-input> <p>{{name}}</p>
等价于
<my-input :uname='name' @changeXXX='val => {foo = val}' value='some value'></my-input>
遇到个比较好用的新插件推荐
将class类的public的数据在vue中实现双向绑定,使用起来比较方便
class中处理类型数据,和dom操作分开
方便开发使用vue-class-model
在vue中使用面向对象class开发,使class的公有数据双向绑定;
如果不需要使用双向绑定可以将属性通过Symbol私有化
安装
npm install vue-class-model or yarn add vue-class-model
配置
// model/hello.js class Hello{ // constructor如果有参数传入需要配置默认值 // 目前需要自己创建init方法初始化数据 constructor(){ // msg双向绑定,数据修改后组件会更新 // 目前对对象,数组可能存在bug,正在后续开发 this.msg = 'Hello' } // 初始化方法名不一定是init,你可以自己命名 init(m){ this.msg = m } setMsg(v){ this.msg = v } }
// main.js import Vue from 'vue' import Models from 'vue-class-model' import Hello from './model/hello.js' Vue.use(Models) const model = new Models({ hello: Hello }) // 配置好后可以在所有组件中使用, // 使用class变量this.$model.hello.msg // 使用class方法this.$model.hello.setMsg('Bye') new Vue({ el:'#app', model })