Самый простой вариант - сделать так, как это рекомендуют разработчики Vue.
В модуле
empty_block вместо экспорта объекта можно экспортировать функцию возвращающую объект.
export default function () {
return {
title: '',
hash: '',
end: {
isEnd: 0,
type: 0
}
}
}
В других модулях соответственно просто пишешь:
import emptyBlock from 'emptyBlock'
let block = emptyBlock()
Почему у вас объект остаётся реактивно связан, так потому-что объекты в JS передаются по ссылке, а не по значению, соответственно даже если вы пересобрали объект с помощью
{ ...someObject }
, объекты которые содержал
someObject
остаются теми же и при любой их мутации у всех владельцев ссылки на объект он меняется.
Кстати, хочу отметить, что в JS не принято писать в snake_case, предпочтителен camelCase.