`v-model` creates two-way data binding on form inputs and custom components. On native elements it is syntactic sugar for `:value` + `@input` (or `:checked` + `@change` for checkboxes/radios). It supports modifiers: `.lazy` switches from `input` to `change` events, `.number` auto-casts the string value to a number, and `.trim` strips leading and trailing whitespace from the bound string.
Custom directives let you encapsulate low-level DOM manipulation that doesn't fit neatly into a component. You define an object with lifecycle hooks (`beforeMount`, `mounted`, `beforeUpdate`, `updated`, `beforeUnmount`, `unmounted`) and register it either globally with `app.directive` or locally by naming it with a `v` prefix in `