D - JavaScript MVVM фреймворк с открытым исходным кодом.
Фреймворк основан на реактивном двустороннем савязывании данных компонента и шаблона.
Код изначально писался исключительно "Для себя", как попытка реализации двустороннего савязывания данных на чистом JS (ES 2015), как пример синтаксиса использовался vue.js.
$data: данные компонента
$methods: доступные методы
watch: отслеживание данных компонента
template: Шаблон для рендеринга
$components: все дочерние компоненты
$parent: родительский компонент
$root: root копомнент
$on: следить за событием
$emit: послать событие
- d-bind:[[prop name]]
- d-text
- d-class
- d-if (будет заменено на d-show)
- d-click
- d-model
- d-enter (в планах реализация d-keydown)
- d-for
<div id="app">
<component_test></component_test>
</div>
D.component("component_test", {
template: `
<div>Test</div>
`
});
Используется для передачи данных дочерним компонентам
Дочернему компоненту в [[prop_name]] будет передано указанное значение
D.component("component_test", {
template: `
<div>
<component_user
d-bind:user="current_user"></component_user>
</div>
`,
data: {
current_user: {
name: "Mars"
}
}
});
D.component("component_user", {
template: `
<span d-text="user.name"></span>
`,
data: {
user: {}
}
});
<div>
<component_user d-bind:user="current_user">
<span d-text="user.name">Mars</span>
</component_user>
</div>
D.component("component_test", {
template: `
<div d-text="name"></div>
`,
data: {
name: "Your name"
}
});
<div d-text="name">Your name</div>
D.component("component_test", {
template: `
<div>
<span d-text="user.name"></span><span d-text="user.sec_name"></span>
</div>
`,
data: {
user: {
name:"Name",
sec_name: "Second name"
}
}
});
<div>
<span d-text="user.name">Name</span><span d-text="user.sec_name">Second name</span>
</div>
- Прямое обращение к свойству d-class="class_name"
- Использование выражений d-class="some ? 'class_one' : 'class_two'"
- Использование синтаксиса d-class="class_name if expression"
D.component("component_test", {
template: `
<div d-class="class_name"></div>
`,
data: {
class_name: "test_class"
}
});
<div d-class="class_name" class="test_class"></div>
D.component("component_test", {
template: `
<div d-class="list.length > 0 ? 'active' : 'disabled'" class="button">Send</div>
`,
data: {
list: ['one', 'two']
}
});
<div d-class="class_name" class="active"></div>
Использование:
- d-if="expression"
D.component("component_test", {
template: `
<div d-if="show">Test</div>
`,
data: {
show: true
}
});
<div d-if="show">Test</div>
D.component("component_test", {
template: `
<div d-click="Hello">Hello</div>
`,
methods: {
Hello: function() {
alert("Hello")
}
}
});
alert("Hello")
D.component("component_test", {
template: `
<div d-click="Hello(name)">Hello</div>
`,
data: {
name: "Your name"
},
methods: {
Hello: function() {
alert("Hello, " + this.$data.name)
}
}
});
alert("Hello Your name")
Связывает value inpput, select, textarea с даннымы компонента
D.component("component_test", {
template: `
<select d-model="select">
<option value="1">One</option>
<option value="2">Two</option>
</select>
`,
data: {
select: 2
}
});
<select d-model="select">
<option value="1">One</option>
<option selected value="2">Two</option>
</select>
Навешивает обработчик keydown на элемент, и срабатывает если нажат Enter
D.component("component_test", {
template: `
<input d-enter="Foo" />
`,
methods: {
Foo: function() {
alert("Enter")
}
}
});
alert("Enter")
Используется для повтороного использования участков компонента. При использовании d-for будет выполнен повторный парсинг данных, таким образом в d-for можно помещать новые компоненты
D.component("component_test", {
template: `
<div d-for="el in list">
<span d-text="el"></span>
</div>
`,
data: {
list: [
"One",
"Two"
]
}
});
<div d-for="el in list" d-path-d-for="true">
<span d-text="el">One</span>
<span d-text="el">Two</span>
</div>
D.component("component_test", {
template: `
<div d-for="el in list">
<component_user
d-bind:name="el"></component_user>
</div>
`,
data: {
list: [
"Dima",
"Dasha"
]
}
});
D.component("component_user", {
template: `
<span d-text="name"></span>
`,
data: {
name: ""
}
});
<div d-for="el in list" d-path-d-for="true">
<component_user d-bind:name="el">
<span d-text="name">Dima</span>
</component_user>
<component_user d-bind:name="el">
<span d-text="name">Dasha</span>
</component_user>
</div>